《汇编语言 基于x86处理器》第八章高级过程部分的代码 - 两种规范计算数组元素的和
▶ 输入 Count 个 32 位有符号整数,计算他们的和
● 代码,使用堆栈传参
;// Sum_main.asm,主过程
INCLUDE Irvine32.inc EXTERN PromptForIntegers@0:PROC ; 外部链接声明需要的函数
EXTERN ArraySum@0:PROC, DisplaySum@0:PROC ArraySum EQU ArraySum@0 ; 外部链接声明需要的变量
PromptForIntegers EQU PromptForIntegers@0
DisplaySum EQU DisplaySum@0 Count = ; 输入的变量数 .data
prompt1 BYTE "Enter a signed 32-bit integer: ",
prompt2 BYTE "Sum: ",
array DWORD Count DUP(?)
sum DWORD ? .code
main PROC
call Clrscr ; 清屏 ; PromptForIntegers( addr prompt1, addr array, Count ),提示信息和输入整数
push Count
push OFFSET array
push OFFSET prompt1
call PromptForIntegers ; eax = ArraySum( addr array, Count ),数组求和
push Count
push OFFSET array
call ArraySum
mov sum,eax ; DisplaySum( addr prompt2, sum ),输出结果
push sum
push OFFSET prompt2
call DisplaySum call Crlf
call WaitMsg
exit
main ENDP
END main
;// _prompt.asm,提示信息和输入整数
INCLUDE Irvine32.inc .code
PromptForIntegers PROC
arraySize EQU [ebp+] ; 获取参数
ptrArray EQU [ebp+]
ptrPrompt EQU [ebp+]
enter ,
pushad mov ecx, arraySize
cmp ecx,
jle L2
mov edx, ptrPrompt
mov esi, ptrArray L1:
call WriteString
call ReadInt
call Crlf
mov [esi], eax
add esi,
loop L1 L2:
popad
leave
ret ; 3 个参数
PromptForIntegers ENDP
END
;// _arrysum.asm,数组求和
INCLUDE Irvine32.inc .code
ArraySum PROC
ptrArray EQU [ebp+]
arraySize EQU [ebp+]
enter ,
push ecx
push esi mov eax, ; 使用循环对数组求和,放入 eax
mov esi, ptrArray
mov ecx, arraySize
cmp ecx,
jle L2 L1:
add eax, [esi]
add esi,
loop L1 L2:
pop esi
pop ecx
leave
ret
ArraySum ENDP
END
;// _display.asm,输出结果
INCLUDE Irvine32.inc .code
DisplaySum PROC
theSum EQU [ebp+]
ptrPrompt EQU [ebp+]
enter ,
push eax
push edx mov edx, ptrPrompt
call WriteString
mov eax, theSum
call WriteInt
call Crlf pop edx
pop eax
leave
ret
DisplaySum ENDP
END
● 代码,使用伪指令 PROTO 和 INVOKE 传参
;// Sum_main.asm,主过程
INCLUDE sum.inc ; 需要头文件 Count = .data
prompt1 BYTE "Enter a signed 32-bit integer: ",
prompt2 BYTE "Sum: ",
array DWORD Count DUP(?)
sum DWORD ? .code
main PROC
call Clrscr INVOKE PromptForIntegers, ADDR prompt1, ADDR array, Count ; 3 个过程直接传参 INVOKE ArraySum, ADDR array, Count
mov sum, eax INVOKE DisplaySum, ADDR prompt2, sum call Crlf
call WaitMsg
exit
main ENDP
END main
;// _prompt.asm,提示信息和输入整数
INCLUDE sum.inc .code
PromptForIntegers PROC, ptrPrompt:PTR BYTE, ptrArray:PTR DWORD, arraySize:DWORD
pushad ; 不用 enter 和 leave mov ecx, arraySize
cmp ecx,
jle L2
mov edx, ptrPrompt
mov esi, ptrArray L1:
call WriteString
call ReadInt
call Crlf
mov [esi], eax
add esi,
loop L1 L2:
popad
ret
PromptForIntegers ENDP
END
;// _arrysum.asm,数组求和
INCLUDE sum.inc
.code ArraySum PROC, ptrArray:PTR DWORD, arraySize:DWORD
push ecx
push esi mov eax,
mov esi, ptrArray
mov ecx, arraySize
cmp ecx,
jle L2 L1:
add eax, [esi]
add esi,
loop L1 L2:
pop esi
pop ecx
ret
ArraySum ENDP
END
;// _display.asm,输出结果
INCLUDE Sum.inc .code
DisplaySum PROC, ptrPrompt:PTR BYTE, theSum:DWORD
push eax
push edx mov edx, ptrPrompt
call WriteString
mov eax, theSum
call WriteInt
call Crlf pop edx
pop eax
ret
DisplaySum ENDP
END
;// sum.inc,头文件
INCLUDE Irvine32.inc PromptForIntegers PROTO, ptrPrompt:PTR BYTE, ptrArray:PTR DWORD, arraySize:DWORD ArraySum PROTO, ptrArray:PTR DWORD, count:DWORD DisplaySum PROTO, ptrPrompt:PTR BYTE, theSum:DWORD
《汇编语言 基于x86处理器》第八章高级过程部分的代码 - 两种规范计算数组元素的和的更多相关文章
- 《汇编语言 基于x86处理器》前五章的小程序
▶ 书中前五章的几个小程序,基本的运算操作,使用了作者的库 Irvine32 和 Irvine64(一开始以为作者网站过期了,各网站上找到的文件大小都不一样,最后发现是要搭梯子 Orz,顺利下载).注 ...
- 《汇编语言 基于x86处理器》第十三章高级语言接口部分的代码 part 2
▶ 书中第十三章的程序,主要讲了汇编语言和 C/++ 相互调用的方法 ● 代码,汇编中调用 C++ 函数 ; subr.asm INCLUDE Irvine32.inc askForInteger P ...
- 《汇编语言 基于x86处理器》第十章 - 运行一个 16位实地址汇编程序
▶ 书上第 10 章,主要讲了宏,引用了一个 16 位实地址的程序,从代码开始到运行 ● 代码 ; main.asm INCLUDE Macros.inc IF IsDefined( RealMode ...
- 《汇编语言 基于x86处理器》第十二章浮点数部分的代码
▶ 书中第十二章的程序,主要讲了 FPU 的指令和浮点数计算的过程 ● 代码,简单的 32 为浮点数测试 INCLUDE Irvine32.inc INCLUDE macros.inc .data f ...
- 《汇编语言 基于x86处理器》第七章整数运算部分的代码
▶ 书中第七章的程序,使用各种位移运算,加深了对内存.寄存器中整数类型变量存储的认识 ● 代码,双字数组右移 4 位 INCLUDE Irvine32.inc COUNT = ; 右移位数 .data ...
- 《汇编语言 基于x86处理器》第六章条件处理部分的代码
▶ 书中第六章的程序,使用了条件判断和跳转来实现一些功能 ● 代码,查找数组首个非零值 INCLUDE Irvine32.inc .data intArray SWORD , , , , , , , ...
- 《汇编语言 基于x86处理器》第十一章 MS-DOS 编程部分的代码 part 2
▶ 书中第十一章的程序,主要讲了 Windows 接口,在小黑框中进行程序交互 ● 在屏幕指定位置输出带自定义属性的文字 INCLUDE Irvine32.inc .data outHandle HA ...
- 《汇编语言 基于x86处理器》第十章结构和宏部分的代码
▶ 书中第十章的程序,主要讲了结构与宏的使用 ● 代码,使用结构,对比是否对齐的性能差距 INCLUDE Irvine32.inc INCLUDE macros.inc structN STRUCT ...
- 《汇编语言 基于x86处理器》第九章字符串与数组部分的代码
▶ 书中第九章的程序,主要讲了字符串相关的输入.输出,以及冒泡排序.二分搜索 ● 代码,Irvine32 中的字符串库函数代码范例 INCLUDE Irvine32.inc .data str1 BY ...
随机推荐
- linux在线中文手册
linux在线中文手册 http://linux.51yip.com/ 百度中的百度应用也不错 http://www.baidu.com/s?word=linux%E5%91%BD%E4%BB%A4& ...
- c++中计算程序执行时间
#include<iostream> #include<time.h> using namespace std; int main() { clock_t t1 = clock ...
- 【AMQ】之安装,启动,访问
1.访问官网下载AMQ 2.解压下载包 windows直接找到系统对应的win32|win64 双击activemq.bat 即可 linux执行 ./activemq start 访问: AMQ默认 ...
- JPanel添加键盘监听事件
因为在自己的游戏需求中谢了要用键盘控制飞机的移动,所以用到键盘监听事件,但是使用了JPanel之后添加了键盘监听事件,按相应的方向键飞机并没有反应.但是如果是为JFrame的内容面板加则会有反应. 为 ...
- windows修改远程桌面端口3389
regedit 按照路径打开,HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-T ...
- vultr 上实现高可用冗余浮动公网IP出口(使用BIRD+BGP协议)High Availability on Vultr with Floating IP and BGP
官方文档: https://www.vultr.com/docs/high-availability-on-vultr-with-floating-ip-and-bgp https://www.vul ...
- PyCharm的一些设置
设置使用UTF-8 在任何情况下: 设置写python脚本,新建 脚本的时候默认加的头文件. # !/usr/bin/env python# -*- coding:utf-8 -*-# Author: ...
- vim查找关键字的好方法
当你用vi打开一个文件后,因为文件太长,如何才能找到你所要查找的关键字呢? 在vi里可没有菜单-〉查找 不过没关系,你在命令模式下敲斜杆( / )这时在状态栏(也就是屏幕左下脚)就出现了 “/” 然 ...
- uigrid配置详解(1)
$scope.gridOptions.rowTemplate = '<div style="background-color: aquamarine" ng-click=&q ...
- Processing Binary Protocols with Client-Side JavaScript
http://blog.mgechev.com/2015/02/06/parsing-binary-protocol-data-javascript-typedarrays-blobs/ https: ...