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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/379314.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从键盘输入一个字符,判断其是不是大写字母,如果是则请输出这个大写字母,如果不是请输出“这不是一个大写字母”的英文信息(要求:能连续输出直到输出“#”结束)。

从键盘输入一个字符&#xff0c;判断其是不是大写字母&#xff0c;如果是则请输出这个大写字母&#xff0c;如果不是请输出“这不是一个大写字母”的英文信息&#xff08;要求&#xff1a;能连续输出直到输出“#”结束&#xff09;。 P155 例4.13 DATA SEGMENT STR DB 0DH,0…

再谈angularjs DI(Dependency Injection)

在前面已经介绍了关于angularjs&#xff0c;以及扩展了一些jQuery ui的一些组件为angularjs的directive。在这里应进口007 在上篇留言我们来看看在angularjs中的DI特性。 DI&#xff1a;依赖注入&#xff0c;是一种软件设计模式&#xff0c;应DIP依赖倒置原则&#xff0c;描述组…

Access sql语句创建表及字段类型

Create TABLE 测试表 ( 文本255 VARCHAR NOT NULL, 文本20 VARCHAR(20) NOT NULL, 日期时间 DATETIME, 数字1 BYTE, 数字2 SMALLINT, 数字4 INTEGER, 布尔 BIT, 自动编号 COUNTER(10, 5) CONSTRAINT PK_TVIPLevel26 PRIMARY KEY, 小数 NUME…

c语言getc函数_C语言中的getc()函数与示例

c语言getc函数C语言中的getc()函数 (getc() function in C) Prototype: 原型&#xff1a; int getc(FILE *filename);Parameters: 参数&#xff1a; FILE *filenameReturn type: int 返回类型&#xff1a; int Use of function: 使用功能&#xff1a; In the file handling…

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

1&#xff1a;使用PROC伪指令定义参数方式不通过寄存器传参&#xff0c;计算数组之和 .386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.data array DWORD 10000h,20000h,30000h,40000h,50000h theSum DWORD ?.code ArraySum PROC USES esi ecx,ptr…

编写计算表达式(X-Y+25)/Z的值得程序,要求将其商和余数分别放在A、B单元中。(设X和Y是32位无符号数,A、B和Z是16位无符号数,不考虑溢出情况。)

编写计算表达式&#xff08;X-Y25&#xff09;/Z的值得程序&#xff0c;要求将其商和余数分别放在A、B单元中。&#xff08;设X和Y是32位无符号数&#xff0c;A、B和Z是16位无符号数&#xff0c;不考虑溢出情况。&#xff09; P151 例4.8 汇编思路&#xff1a;首先在DATA段定…

《深入浅出WPF》笔记——绑定篇(一)

上一节&#xff0c;有记录写到&#xff1a;在WPF里&#xff0c;数据驱动UI&#xff0c;数据占核心地位&#xff0c;UI次之。怎么恢复数据的核心地位&#xff0c;那就要先了解一下Binding。 一、Binding 基础 1.1WPF中Data Binding的带来的方便 在设计架构的时间&#xff0c;大家…

你的代码完成了吗?(之二)——可维护性和规范性

二. 可维护性和规范性 对于代码来说&#xff0c;这两个属性其实是紧密相连的。什么样的代码最好维护呢&#xff1f;当然是规范的代码了。再差的规范也要比没有规范强得多。 之前做对日项目的时候&#xff0c;日本人对于“规范”这个东西&#xff08;他们称之为开发规约&#xf…

c语言feof函数_使用示例的C语言中的feof()函数

c语言feof函数C语言中的feof()函数 (feof() function in C) Prototype: 原型&#xff1a; int feof(FILE* filename);Parameters: 参数&#xff1a; FILE *filenameReturn type: int(0 or 1) 返回类型&#xff1a; int(0或1) Use of function: 使用功能&#xff1a; In C l…

5种经典排序算法,每个程序员都应该知道

我的新书《Android App开发入门与实战》已于2020年8月由人民邮电出版社出版&#xff0c;欢迎购买。点击进入详情 有没有想过当您应用从低到高、从高到低或按字母顺序等过滤器时&#xff0c;亚马逊或任何其他电子商务网站中的产品如何排序&#xff1f;排序算法对于此类网站起着至…

汇编语言-016(SCASB 、STOSB 、LODSD 、数组中的取值、二维数组操作、冒泡排序和二分查找、CMPSW )

1&#xff1a; SCASB : (字节)将AL的值与EDI寻址的一个字比较。进行在一个字符串检索特定的字符 .386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.data alpha BYTE "ABCDEFGH",0.code main PROCmov edi,OFFSET alpha ;EDI指向字符串mov …

编写一个汇编语言程序,将字符串Hello World中的全部小写字母转换为大写字母,并存放回原地址处。

编写一个汇编语言程序&#xff0c;将字符串"Hello World"中的全部小写字母转换为大写字母&#xff0c;并存放回原地址处。 P176 4.10 编程思路&#xff1a;首先DATA段中&#xff0c;定义string存放字符串"Hello World"&#xff0c;LEN为字符串string长度…

在Python中使用OpenCV(CV2)对图像进行边缘检测

Modules used: 使用的模块&#xff1a; For this, we will use the opencv-python module which provides us various functions to work on images. 为此&#xff0c;我们将使用opencv-python模块&#xff0c;该模块为我们提供了处理图像的各种功能。 Download opencv-pytho…

需保留小数点两位,但同时不要小数点后多余0的前后台代码实现

今天碰到一个需求。关于小数点的处理&#xff0c;看起来非常简单的事情&#xff0c;却花了一定时间做了一些试验。最后简单总结一下&#xff0c;以便备忘。 需求简化一下表达是这样的&#xff1a; 有A、B两列&#xff0c;A/BC。这3列在数据库中都以decimal存放。 在应用中&…

汇编语言-017(SCASW 、STRUCT 、STRUCT_ALLPOINTS 、STRUCT_ALIGN 、SYSTEMTIME、UNION 、 STRUCTTEST )

1&#xff1a;SCASW : 在wordArray中扫描16位数值0100h,将匹配元素的偏移量复制到EAX .386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.data wordArray WORD 0500h,0400h,0300h,0200h,0100h.code main PROCmov ax,0100hmov edi,OFFSET wordArraymov …

【笔记】正则表达式[1]

元字符 符号 意思 示范 详例 \d 任意一个数字 \d{2}-\d{8} 22-12345678 * *前的符号重复任意次数 次数可以为零 \d* 222222222222... 或 2 \s 任意的空白符 全半角空格&#xff0c;tab&#xff0c;换行符 \bhi\b\s\bLucy\b hi Lucy 和*用法相似 次数>1 \d …

编写一个汇编语言程序,完成以下要求。从BUF单元处定义有10个带符号字数据:-1,3,24,94,62,72,55,0,-48,99,试找出他们中的最大值和平均值,并以此分别存放至该数据区的后两个单元

编写一个汇编语言程序&#xff0c;完成以下要求。从BUF单元处定义有10个带符号字数据:-1,3,24,94,62,72,55,0,-48,99&#xff0c;试找出他们中的最大值和平均值&#xff0c;并以此分别存放至该数据区的后两个单元中(假设这10个数的和值不超过16位范围) P176 4.12 编程思路&am…

prototype 的ajax

原文&#xff1a;http://www.prototypejs.org/learn/introduction-to-ajax]翻 译&#xff1a;www.ruby-china.cn 站长]Prototype框架提供了非常容易和有意思的方法处理Ajax的调用&#xff0c;同时它也是浏 览器安全的 。除了简单的请求外&#xff0c;这个模块&#xff08;指pro…

汇编语言-018(FLD 、FST、FSTP、FCHS、FABS 、浮点运算符、浮点比较 )

1&#xff1a;FLD : FPU&#xff08;浮点处理器&#xff09;的加载浮点数到堆栈指令 .386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.data array REAL8 10 DUP(?) dblOne REAL8 234.56 dblTwo REAL8 10.1.code main PROCfld array …

mcq 队列_MCQ | 基础知识 免费和开源软件| 套装4

mcq 队列Q1. What do you call the technique of storing encrypted user passwords in Linux? Q1。 您如何称呼在Linux中存储加密的用户密码的技术&#xff1f; System Password Management 系统密码管理 Shadow Password 影子密码 Encrypted Password 加密密码 None of the…