1:编写过程,仅用移位和加法,实现任意32位符号数与EAX相乘

include Irvine32.inc.stack 4096
ExitProcess PROTO,dwExitCode:DWORD.code
main PROC mov eax,80mov ebx,53call BitwiseMultiplycall WriteDecINVOKE ExitProcess,0
main ENDP;EAX=被乘数,EBX=乘数
BitwiseMultiply PROCmov edx,0mov ecx,32
L0:shl ebx,1jnc L1push ecxdec ecxpush eaxshl eax,cladd edx,eaxpop eaxpop ecx
L1:loop L0mov eax,edxret
BitwiseMultiply ENDPEND main

2:编写过程,实现任意两个大小(但两个数字节要一样长)的压缩十进制数加法

include Irvine32.inc.stack 4096
ExitProcess PROTO,dwExitCode:DWORDbyteSize = 4
.data
packed_1 BYTE 36h,45h,87h,99h
packed_2 BYTE 72h,07h,23h,45h
sum BYTE byteSize+1 DUP(0).code
main PROCmov esi,OFFSET packed_1mov edi,OFFSET packed_2mov edx,OFFSET summov ecx,byteSizecall AddPackedINVOKE ExitProcess,0
main ENDP;ESI 第一个数的指针
;EDI 第二个数的指针
;EDX 和数指针
;ECX 相加的字节数
AddPacked PROCclc
L0:mov al,BYTE PTR[esi]adc al,BYTE PTR[edi]daamov BYTE PTR[edx],alinc esiinc ediinc edxloop L0mov al,0adc al,0mov BYTE PTR[edx],alret
AddPacked ENDP
END main

3:LEA : 伪指令LEA使用

.386
.model flat,stdcall.stack 4096
ExitProcess PROTO,dwExitCode:DWORD.code
main PROCINVOKE ExitProcess,0
main ENDP;void makeArray()
;{;  char myString[30];
;  for(int i =0;i<30;i++)
;    myString[i]='*';
;}
makeArray PROCpush ebpmov ebp,espsub esp,32   ;myString位于EBP-30的位置,因为会向4字节对齐lea esi,[ebp-30] ;加载myString的地址;mov esi,OFFSET[ebp -30] 报错,OFFSET只适用编译时已知地址mov ecx,30    ;循环计数器
L1:mov BYTE PTR[esi],'*' ;填充inc esi    ;下一个元素loop L1   add esp,32 ;删除数组(恢复ESP)pop ebpret
makeArray ENDP
END main

4:ENTER_LEAVE : ENTER创建一个过程的堆栈帧,LEAVE结束一个过程的堆栈帧

.386
.model flat,stdcall.stack 4096
ExitProcess PROTO,dwExitCode:DWORD.code
main PROCINVOKE ExitProcess,0
main ENDPMySub PROCenter 8,0  ;保留8个字节局部变量;等于;push ebp;mov ebp,esp;sub esp,8  leave;等于;mov esp,ebp;pop ebpret
MySub ENDP
END main

5:LOCAL : 为ENTER和LEAVE的高级版,可以定义局部变量类型与名字,跟在PROC后使用 LOCAL label:type ,…

.386
.model flat,stdcall.stack 4096
ExitProcess PROTO,dwExitCode:DWORD.code
main PROCcall Example1INVOKE ExitProcess,0
main ENDPExample1 PROCLOCAL temp:DWORDmov eax,tempret
Example1 ENDP;生成汇编是下面这样,可以查看反汇编
;push ebp
;mov ebp,esp
;add esp,0FFFFFFFCh ;ESP加-4
;mov eax,[ebp-4]
;leave
;ret
END main

6:递归函数,整数求和

include Irvine32.inc.code
main PROCmov ecx,5  ;计数值=5mov eax,0  ;存放和数call CalcSum;计算和数call WriteDeccall Crlfexit
main ENDPCalcSum PROCcmp ecx,0  ;检查计数值jz L2      ;若为零则退出add eax,ecx ;否则与和数相加dec ecx    ;计数值递减call CalcSum;递归调用
L2: ret
CalcSum ENDP
END main

7:递归函数,阶乘

include Irvine32.inc.code
main PROCpush 5  ;计算5!call Factorial  ;计算阶乘(EAX)call WriteDeccall Crlfexit
main ENDP;计算阶乘
;接收:[ebp+8]=n 需计算的数
;返回:eax =n 阶乘
Factorial PROCpush ebpmov ebp,espmov eax,[ebp+8] ;获取Ncmp eax,0ja L1mov eax,1jmp L2L1:dec eaxpush eaxcall Factorial
;每次递归调用返回时,都要执行下面的指令
ReturnFact:mov ebx,[ebp+8]mul ebx  ;EDX:EAX = EAX*EBX
L2:pop ebp ;返回EAXret 4  ;清除堆栈
Factorial ENDP
END main

8:INVOKE_ADDR : 调用指令INVOKE 与 地址指令ADDR

.386
.model flat,stdcall.stack
ExitProcess PROTO,dwExitCode:DWORD.data
Array DWORD 20 DUP(?).code
main PROC;INVOKE Swap,ADDR Array,ADDR [Array+4]  ;ADDR只能与INVOKE使用,也能是汇编常数;如果是使用stdcall,汇编器生成下面代码;push OFFSET Array+4;push OFFSET Array;call SwapINVOKE ExitProcess,0
main ENDPSwap PROCret
Swap ENDP
END main

9:PROC伪指令声明过程时,声明要接收的参数方式

.386
.model flat,stdcall.stack 4096
ExitProcess PROTO,dwExitCode:DWORD.code
main PROCpush 9push 10call AddTwoINVOKE ExitProcess,0
main ENDPAddTwo PROC,val1:DWORD,val2:DWORDmov eax,val1add eax,val2ret
AddTwo ENDP
;汇编器生成代码。因为是stdcall ret加上8 ,可以查看反汇编
;push ebp
;mov ebp,esp
;mov eax,dword ptr[ebp+8]
;add eax,dword ptr[ebp+0ch]
;leave
;ret 8END main

10:PROC伪指令声明过程时,声明要接收的参数方式和局部变量

.386
.model flat,stdcall.stack 4096
ExitProcess PROTO,dwExitCode:DWORD.code
main PROCINVOKE ExitProcess,0
main ENDPRead_File PROC USES eax ebx,pBuffer:PTR BYTELOCAL fileHandle:DWORDmov esi,pBuffermov fileHandle,eaxret
Read_File ENDP
;汇编器生成代码
;push ebp
;mov ebp,esp
;add esp,0FFFFFFFCh  ;创建fileHandle
;push eax  ;保存eax
;push ebx
;mov esi,dword ptr[ebp+8] ;pBuffer
;mov dword ptr[ebp-4],eax ;fileHandle
;pop ebx
;pop eax
;leave
;ret 4   有一个参数4字节
END main

汇编语言-014(编写过程的应用、伪指令LEA、ENTER、LEAVE、LOCAL、递归函数、INVOKE、ADDR、PROC伪指令声明过程)相关推荐

  1. 汇编语言-015(PROC伪指令定义参数方式、EXTERNDEF、INCLUDE 、EXTERN 、INVOKE、PROC、PROTO 、MOVSB 、MOVSD 、CMPSD )

    1:使用PROC伪指令定义参数方式不通过寄存器传参,计算数组之和 .386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DW ...

  2. 【C语言初级阶段学习1】使用vscode运行C语言,vscode配置环境超详细过程(包括安装vscode和MinGW-W64安装及后续配置使用的详细过程,vscode用户代码片段的使用)[考研专用]

    vscode配置c语言环境 前言 一.下载vscode和MinGW-W64和安装过程 1. vscode部分 1.1 vscode下载安装过程 1.2 vscode下载插件 2. MinGW-W64部 ...

  3. C语言的变量和汇编中的伪指令,伪指令 尤其EQU DW DB(微机和单片机中的作用稍微不同,但是规则机制相同)微机原理中的汇编指令和伪指令是标准的,单片机的指令和伪指令是在微机标准版基础上修改的版

    微机原理中表明 变量用伪指令DW,DB 单片机中的伪指令EQU C语言中的变量来源与汇编的伪指令(微机和单片机中的作用稍微不同,但是规则机制相同)微机原理中的汇编指令和伪指令是标准的,单片机的指令和伪 ...

  4. 汇编语言:编写代码实现字符串的复制

    问题介绍 编写代码 实现字符串'welcome to masm!'复制到它后面的数据区中. assume cs:code,ds:data data segmentdb 'welcome to masm ...

  5. 汇编语言:编写code段中的代码,用push指令将a段中的前8个字型数据,逆序存储b段中

    题目介绍 程序如下,编写code段中的代码,用push指令将a段中的前8个字型数据,逆序存储b段中. assume cs:code,ds:a,ss:ba segmentdw 1,2,3,4,5,6,7 ...

  6. 汇编语言:编写code段中代码,将a段和b段中的数据依次相加,将结果放到c段

    题目介绍 程序如下,编写code段中代码,将a段和b段中的数据依次相加,将结果放到c段. assume cs:code,ds:a,ds:b,ds:ca segmentdb 1,2,3,4,5,6,7, ...

  7. 89c51,8255,6个led数码管显示时钟的汇编语言程序,汇编语言要求编写一个时钟程序 用八位数码管实现时分秒的计时功能...

    我以前做的一个6位数码管的时钟程序,你可以看看,其实6位足够了. KEYVALEQU 30H KEYTMEQU 31H KEYSCANEQU 32H DATEQU 33H SCANLEDEQU 39H ...

  8. c语言定义寄存器中的两位,汇编语言:编写一个程序,显示AL寄存器中的两位十六进制数...

    满意答案 deuej 2013.05.31 采纳率:43%    等级:12 已帮助:9924人 data segment data ends stack segment db256 dup(?) s ...

  9. 使用scrum开发软件的一般过程是什么?_黑色灌封胶的使用工艺复杂吗?使用过程中应该注意什么?...

    随着胶粘剂研发与生产技术的提升,令黑色灌封胶的品质有所提升.操作工艺越来越简单,通过灵活的操作方法,令其发挥更多优势.节省了操作时间,降低了物料的浪费. 黑色灌封胶的使用工艺很复杂吗? 1. 将AB两 ...

最新文章

  1. python常用模块收录
  2. android studio导入jar包
  3. mysql监听串口_tcp与串口透传(select)
  4. 华为机试在线训练|解题记录|HJ01-103
  5. 固高运动控制卡学习7 --模拟量
  6. Golang go mod 使用
  7. 计算机的就业指导论文,★计算机就业指导论文题目计算机就业指导毕业论文题目大全计算机就业指导论文选题参考...
  8. 利用Cookie进行自动登录
  9. 2016.8.6 学习总结
  10. Java中为什么有时候通过指定编码集无法解决乱码
  11. JSR303校验的简单使用以及自定义校验规则的代码编写
  12. Axure与markman
  13. talib.APO绝对价格振荡器指标详解
  14. python爬虫有多少种方式_python爬虫-----Python访问http的几种方式
  15. Java基础 课后作业错题集
  16. 如何使用pycharm连接Databricks
  17. Uniapp实现小程序获取用户微信信息功能
  18. React Native Elements
  19. (四)微信小程序之实现轮番效果(swiper)
  20. 人工智能已到瓶颈! AI未来发展方向

热门文章

  1. CSS 学习路线(二)选择器
  2. ScrollReveal.js – 帮助你实现超炫的元素运动效果
  3. [折半搜索][has] Jzoj P4250 路径
  4. 解决swiper-slide在ion-slide-box不滑动的问题(暂且这么描述)
  5. Django集合Ueditor
  6. Unrecognized option: -jrockit
  7. 玩转MySQL之Linux下的简单操作(服务启动与关闭、启动与关闭、查看版本)
  8. WebClient与WebRequest差异
  9. 根据数据库中的值用js设置RadioButtonList选中与否
  10. java.util.hashmap_java.util.HashMap中的无限循环