《汇编语言 基于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 ...
随机推荐
- ubuntu 17.10.1 安装 virtual box 增强工具
ubuntu 17.10.1 安装 virtual box 增强工具遇到 “ Please install the gcc make perl packages from your distribu ...
- C++进阶--结构体和类
// 单纯从语言上来说,两者唯一的区别是,默认成员是公有还是私有 // 从使用习惯上 // 小的消极对象,包含公有数据,没有或仅有很少的基本的成员函数 -- 数据容器 struct Person_t ...
- bzoj 4866: [Ynoi2017]由乃的商场之旅
设第i个字母的权值为1<<i,则一个可重集合可以重排为回文串,当且仅当这个集合的异或和x满足x==x&-x,用莫队维护区间内有多少对异或前缀和,异或后满足x==x&-x,这 ...
- SSH的配置文件
Hibernate: xxx.hbm.xml ,作用:类的属性和表的列建立映射关系,主键策略,多表查询等 hibernate.cfg.xml ,核心配置文件,数据库配置信息,加载xxx.hbm.x ...
- 延时队列:Java中的DelayQueue
Java中的DelayQueue位于java.util.concurrent包下,本质是由PriorityQueue和BlockingQueue实现的阻塞优先级队列. 放入队列的元素需要实现java. ...
- 【转载】这样去写你的HTML
昨天在 twitter 上说,怎么忍心把页面写得这么难用?是的,这个世界还有一群人等着我们创建出来的东西,可以让他们的生活能过得更容易呢.比如那些需要读屏软件的用户.作为一个前端,我们又怎么会忍心呢. ...
- 廖雪峰Java3异常处理-2断言和日志-3使用Commons Logging
Commons Logging是Apache创建的日志模块: 可以挂接不同的日志系统 可以通过配置文件指定挂接的日志系统 自动搜索并使用Log4j 如果Log4j不存在,使用JDK Logging(J ...
- Java热部署相关
今天发现早年在大象笔记中写的一篇笔记,之前放在ijavaboy上的,现在它已经访问不了了.前几天又有同事在讨论这个问题.这里拿来分享一下. 在web应用开发或者游戏服务器开发的过程中,我们时时刻刻都在 ...
- version control(关于版本控制)
版本控制(Version Control Systems)是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统. 这个系统可以自动帮我们备份文件的每一次更改,并且可以非常方便的恢复到 ...
- orcale 函数wm_concat不存咋lob值使用zh_concat 替换
create or replace TYPE zh_concat_im AUTHID CURRENT_USER AS OBJECT ( CURR_STR VARCHAR2(32767), STATIC ...