▶ 输入 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处理器》第八章高级过程部分的代码 - 两种规范计算数组元素的和的更多相关文章

  1. 《汇编语言 基于x86处理器》前五章的小程序

    ▶ 书中前五章的几个小程序,基本的运算操作,使用了作者的库 Irvine32 和 Irvine64(一开始以为作者网站过期了,各网站上找到的文件大小都不一样,最后发现是要搭梯子 Orz,顺利下载).注 ...

  2. 《汇编语言 基于x86处理器》第十三章高级语言接口部分的代码 part 2

    ▶ 书中第十三章的程序,主要讲了汇编语言和 C/++ 相互调用的方法 ● 代码,汇编中调用 C++ 函数 ; subr.asm INCLUDE Irvine32.inc askForInteger P ...

  3. 《汇编语言 基于x86处理器》第十章 - 运行一个 16位实地址汇编程序

    ▶ 书上第 10 章,主要讲了宏,引用了一个 16 位实地址的程序,从代码开始到运行 ● 代码 ; main.asm INCLUDE Macros.inc IF IsDefined( RealMode ...

  4. 《汇编语言 基于x86处理器》第十二章浮点数部分的代码

    ▶ 书中第十二章的程序,主要讲了 FPU 的指令和浮点数计算的过程 ● 代码,简单的 32 为浮点数测试 INCLUDE Irvine32.inc INCLUDE macros.inc .data f ...

  5. 《汇编语言 基于x86处理器》第七章整数运算部分的代码

    ▶ 书中第七章的程序,使用各种位移运算,加深了对内存.寄存器中整数类型变量存储的认识 ● 代码,双字数组右移 4 位 INCLUDE Irvine32.inc COUNT = ; 右移位数 .data ...

  6. 《汇编语言 基于x86处理器》第六章条件处理部分的代码

    ▶ 书中第六章的程序,使用了条件判断和跳转来实现一些功能 ● 代码,查找数组首个非零值 INCLUDE Irvine32.inc .data intArray SWORD , , , , , , , ...

  7. 《汇编语言 基于x86处理器》第十一章 MS-DOS 编程部分的代码 part 2

    ▶ 书中第十一章的程序,主要讲了 Windows 接口,在小黑框中进行程序交互 ● 在屏幕指定位置输出带自定义属性的文字 INCLUDE Irvine32.inc .data outHandle HA ...

  8. 《汇编语言 基于x86处理器》第十章结构和宏部分的代码

    ▶ 书中第十章的程序,主要讲了结构与宏的使用 ● 代码,使用结构,对比是否对齐的性能差距 INCLUDE Irvine32.inc INCLUDE macros.inc structN STRUCT ...

  9. 《汇编语言 基于x86处理器》第九章字符串与数组部分的代码

    ▶ 书中第九章的程序,主要讲了字符串相关的输入.输出,以及冒泡排序.二分搜索 ● 代码,Irvine32 中的字符串库函数代码范例 INCLUDE Irvine32.inc .data str1 BY ...

随机推荐

  1. 关于高并发下kafka producer send异步发送耗时问题的分析

    最近开发网关服务的过程当中,需要用到kafka转发消息与保存日志,在进行压测的过程中由于是多线程并发操作kafka producer 进行异步send,发现send耗时有时会达到几十毫秒的阻塞,很大程 ...

  2. DEVC++ C++ Builder6.0

    Devc++安装后无法正常编译程序 出现错误,不知道是什么,可能是不兼容的原因 然后就是一直编译出错,程序是最简单的helloworld程序. 之后选择安装C++ Builder 6.0

  3. NP完全性理论与近似算法

    转自:http://www.cnblogs.com/chinazhangjie/archive/2010/12/06/1898070.html 一.图灵机 根据有限状态控制器的当前状态及每个读写头读到 ...

  4. WPF DataGrid添加编号列

    WPF DataGrid添加编号列? 第一步:<DataGridTemplateColumn Header="编号" Width="50" MinWidt ...

  5. 我的less学习之路

    less注释 可以在代码中使用块样式(/* */)和行内注释(//),但是当编译LESS代码时,单行注释不会显示在CSS文件中.开发中主要维护的是less文件,所以可以使用行内注释,最终编译的css文 ...

  6. SpringSecurity-ChannelProcessingFilter的作用

    ChannelProcessingFilter决定的是web请求的通道,即http或https. 在springsecurity配置文件中添加这样一行 <intercept-url patter ...

  7. 【Darwin学习笔记】之获取系统处理器数量的方法

    阅读Darwin源码的时候看到这个方法,感觉挺有用处,且考虑了多种平台下的实现方式,直接贴代码,以后说不定会用到~ 单一种平台下的实现方法可能很容易,但是把这些个系统都收集在一起,在一个函数中实现还是 ...

  8. Kubernetes1.8以后kubelet连接api-server问题

    Kubernetes1.8以后版本,kubelet命令去掉--api-servers选项,参考官方kubelet 1.8 --kubeconfig string Path to a kubeconfi ...

  9. java的应用包的方法,及调用类里面函数的原理

    selenium官网下载的selenium包 包导入eclipse 见:https://www.cnblogs.com/kaibindirver/p/10674604.html 代码

  10. Java-Runoob-高级教程-实例-数组:16. Java 实例 - 数组并集

    ylbtech-Java-Runoob-高级教程-实例-数组:16. Java 实例 - 数组并集 1.返回顶部 1. Java 实例 - 数组并集  Java 实例 以下实例演示了如何使用 unio ...