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

1:使用PROC伪指令定义参数方式不通过寄存器传参,计算数组之和

.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,ptrArray:PTR DWORD,szArray:DWORDmov esi,ptrArraymov ecx,szArraymov eax,0cmp ecx,0je L2
L1:add eax,[esi]add esi,4loop L1
L2:ret
ArraySum ENDPmain PROCINVOKE ArraySum,ADDR array,  ;数组地址LENGTHOF array;元素个数mov theSum,eax;保存和数INVOKE ExitProcess,0
main ENDP
END main

2:使用PROC伪指令定义参数方式不通过寄存器传参,交换两个值

include Irvine32.incSwap PROTO,pValx:PTR DWORD ,pValy:PTR DWORD
.data
Array DWORD 10000h,20000h.code
main PROC;显示交换前的数组mov esi,OFFSET Arraymov ecx ,2mov ebx,TYPE Arraycall DumpMemINVOKE Swap,ADDR Array,ADDR[Array + 4]call DumpMemexit
main ENDPSwap PROC USES eax esi edi,pValx:PTR DWORD,pValy:PTR DWORDmov esi,pValxmov edi,pValymov eax,[esi]xchg eax,[edi]mov [esi],eaxret
Swap ENDP
END main

3:EXTERNDEF_INCLUDE : EXTERNDEF和INCLUDE伪指令,跨模块使用变量和标号

vars.inc

EXTERNDEF count:DWORD , SYM1:ABS

sub1.asm

.386
.model flat,stdcall
include vars.incSYM1 = 10
.data
count DWORD 0
END

main.asm

.386
.model flat,stdcall
.stack 4096
ExitProcess PROTO,dwExitCode:DWORDinclude vars.inc
.code
main PROCmov count,2000hmov eax,SYM1INVOKE ExitProcess,0
main ENDP
END main

4:EXTERN : 用EXTERN伪指令,多模块编写过程调用,传统的使用

ArraySum.asm

;ArraySum过程
include Irvine32.inc.code
;计算32位整数数组之和
;接收:
;    ptrArray ;数组指针
;    arraySize;数组大小(DWORD)
;返回:EAX = 和数
ArraySum PROCptrArray EQU [ebp+8]arraySize EQU [ebp+12]enter 0,0push ecx push esimov eax,0mov esi,ptrArraymov ecx,arraySizecmp ecx,0jle L2
L1:add eax,[esi]add esi,4loop L1
L2:pop esipop ecxleaveret 8
ArraySum ENDP
END

DisplaySum.asm

;DisplaySum
include Irvine32.inc.code
;在控制台显示和数
;接收:
;    ptrPrompt  ;提示字符串的偏移量
;    theSum     ;数组和数(DWORD)
;返回:无
DisplaySum PROCtheSum EQU [ebp+12]ptrPrompt EQU [ebp+8]enter 0,0push eaxpush edxmov edx,ptrPromptcall WriteStringmov eax,theSumcall WriteIntcall Crlfpop edxpop eaxleaveret 8
DisplaySum ENDP
END 

PromptForIntegers.asm

;提示整数输入
include Irvine32.inc.code
;提示用户为数组输入整数,并用用户输入填充数组
;接收:
;    ptrPrompt:PTR BYTE ;提示信息字符串
;    ptrArray:PTR DWORD ;数组指针
;    arraySize:DWORD    ;数组大小
;返回:无
PromptForIntegers PROCarraySize EQU [ebp+16]ptrArray EQU [ebp+12]ptrPrompt EQU [ebp+8]enter 0,0pushad   mov ecx,arraySizecmp ecx,0jle L2mov edx,ptrPromptmov esi,ptrArray
L1:call WriteStringcall ReadIntcall Crlfmov [esi],eaxadd esi,4loop L1
L2:popadleaveret 12
PromptForIntegers ENDP
END 

Startup.asm

;整数求和过程
;多模块示例
;本程序由用户输入多个整数
;将它们存入数组,计算数组之和
;并显示和数
include Irvine32.incEXTERN PromptForIntegers@0:PROC
EXTERN ArraySum@0:PROC , DisplaySum@0:PROC;为了方便,重新定义外部符号
ArraySum EQU ArraySum@0
PromptForIntegers EQU PromptForIntegers@0
DisplaySum   EQU DisplaySum@0
;修改Count来改变数组大小
Count = 3.data
prompt1 BYTE "Enter a signed integers: ",0
prompt2 BYTE "The sum of the integers is: ",0
array DWORD Count DUP(?)
sum  DWORD ?.code
main PROCcall Clrscr;PromptForIntegers(addr prompt1,addr array,Count)push Countpush OFFSET arraypush OFFSET prompt1call PromptForIntegers;sum = ArraySum(addr array,Count)push Countpush OFFSET arraycall ArraySummov sum,eax;DisplaySum(addr prompt2,sum)push sumpush OFFSET prompt2call DisplaySumcall Crlfexit
main ENDP
END  main

5:INVOKE_PROC_PROTO : 使用INVOKE和PROC和PROTO更高级的来进行多模块编程,相比EXTERN简化很多细节

arraySum.am

;ArraySum 过程
include sum.inc.code
ArraySum PROC,ptrArray:PTR DWORD,  ;数组指针arraySize:DWORD      ;数组大小
;计算32位整数数组之和
;返回:EAX = 和数push ecx push esimov eax,0mov esi,ptrArraymov ecx,arraySizecmp ecx,0jle L2
L1:add eax,[esi]add esi,4loop L1
L2:pop esipop ecxret 
ArraySum ENDP
END

display.asm

;Display过程
include sum.inc.code
DisplaySum PROC,ptrPrompt:PTR BYTE,   ;提示字符串theSum:DWORD          ;数组之和
;
;在控制台显示和数
;返回:无push eaxpush edxmov edx,ptrPrompt  call WriteStringmov eax,theSumcall WriteIntcall Crlfpop edxpop eaxret
DisplaySum ENDP
END 

prompt.asm

;提示整数输入请求
include sum.inc  ;获取过程.code
PromptForIntegers PROC,ptrPrompt:PTR BYTE,  ;提示字符串ptrArray:PTR DWORD,  ;数组指针arraySize:DWORD      ;数组大小;提示用户输入数组幸免于难,并用用户输入填充数组;返回:无pushad   mov ecx,arraySizecmp ecx,0jle L2mov edx,ptrPromptmov esi,ptrArray
L1:call WriteStringcall ReadIntcall Crlfmov [esi],eaxadd esi,4loop L1
L2:popadret 
PromptForIntegers ENDP
END 

sum.inc

include Irvine32.incPromptForIntegers PROTO,ptrPrompt:PTR BYTE ,  ;提示字符串ptrArray:PTR DWORD,   ;数组指针arraySize:DWORD       ;数组大小ArraySum PROTO,ptrArray:PTR DWORD,    ;数组指针arraySize:DWORD       ;数组大小DisplaySum PROTO,ptrPrompt:PTR BYTE,   ;提示字符串theSum:DWORD          ;数组之和

sum_main.asm

;整数求和
include sum.inc
Count = 3
.data
prompt1 BYTE "Enter a signed integers: ",0
prompt2 BYTE "The sum of the integers is: ",0
array DWORD Count DUP(?)
sum  DWORD ?.code
main PROCcall ClrscrINVOKE PromptForIntegers,ADDR prompt1,ADDR array,CountINVOKE ArraySum,ADDR array,Countmov sum,eaxINVOKE DisplaySum,ADDR prompt2,sumcall Crlfexit
main ENDP
END main

6:使用LOCAL 定义一系列局部变量

.386
.model flat,stdcall.stack 4096
ExitProcess PROTO,dwExitCode:DWORD.code
main PROCcall Proc_1INVOKE ExitProcess,0
main ENDPProc_1 PROCLOCAL pArray:PTR DWORD,buffer[20]:BYTE,pwArray:WORD,myByte:SBYTE,myArray[20]:DWORDret
Proc_1 ENDPEND main

7:编写过程ShowParams,显示过程参数。显示被调用过程运行时堆栈中32位参数的地址和十六进制数值 过程接收一个参数,表示显示参数的个数

include Irvine32.inc.stack 4096
ExitProcess PROTO,dwExitCode:DWORD
MySample PROTO ,first:DWORD,second:DWORD,third:DWORD.data
outAddr BYTE "Address ",0
outEqule BYTE " = ",0 .code
main PROCINVOKE MySample,1234h,5000h,6543hINVOKE ExitProcess,0
main ENDPMySample PROC ,first:DWORD,second:DWORD,third:DWORDparamCount = 3push paramCount  ;显示MySample中的三个参数call ShowParamsret
MySample ENDPShowParams PROC arg1 EQU [ebp+8]enter 0,0push ecxpush esipush edxmov ecx,arg1mov esi,[ebp]add esi,8
L1:mov edx,OFFSET outAddrcall WriteStringmov eax,esicall WriteHexmov edx,OFFSET outEqulecall WriteStringmov eax,[esi]call WriteHexcall Crlfadd esi,4loop L1pop edxpop esipop ecxleaveret 4
ShowParams ENDP
END main

8:MOVSB : (字节)从ESI的寻址的内存数据复制到EDI寻址的内存位置,加上rep 重复操作

.386
.model flat,stdcall.stack 4096
ExitProcess PROTO,dwExitCode:DWORD.data
string1 BYTE "ABCDEFGHIJKLMN",0
string2 BYTE "abcdefghijklmn",0.code
main PROCcld           ;清除方向标志位mov esi,OFFSET string1 ;esi 指向源mov edi,OFFSET string2 ;edi 指向目的mov ecx,10   ;计数器为10rep movsb        ;传送10个字节INVOKE ExitProcess,0
main ENDP
END main

9:MOVSD : (双字)从ESI的寻址的内存数据复制到EDI寻址的内存位置,加上rep 重复操作

.386
.model flat,stdcall.stack 4096
ExitProcess PROTO,dwExitCode:DWORD.data
source DWORD 20 DUP(0FFFFFFFFh)
target DWORD 20 DUP(?).code
main PROCcld           ;清除方向标志位mov esi,OFFSET source ;esi 指向源mov edi,OFFSET target ;edi 指向目的mov ecx,LENGTHOF source   ;计数器为10rep movsd        ;传送10个字节INVOKE ExitProcess,0
main ENDP
END main

10:CMPSD : (双字)比较ESI指向的内存操作数与EDI指向的内存操作数

.386
.model flat,stdcall.stack 4096
ExitProcess PROTO,dwEixtCode:DWORD.data
source DWORD 1234h
target DWORD 5678h.code
main PROCmov esi, OFFSET sourcemov edi,OFFSET targetcldcmpsd                   ;比较双字ja L1                   ;若source>target则跳转
L1:mov esi ,OFFSET sourcemov edi,OFFSET targetcldmov ecx , LENGTHOF source  ;设置重复计数器repe cmpsd    ;相等则重复INVOKE ExitProcess,0
main ENDP
END main

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

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

相关文章

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

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

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

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

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

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

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

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

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

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

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

1: 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中的全部小写字母转换为大写字母,并存放回原地址处。

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

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

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

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

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

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

1: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 任意的空白符 全半角空格,tab,换行符 \bhi\b\s\bLucy\b hi Lucy 和*用法相似 次数>1 \d …

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

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

prototype 的ajax

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

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

1:FLD : FPU(浮点处理器)的加载浮点数到堆栈指令 .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中存储加密的用户密码的技术? System Password Management 系统密码管理 Shadow Password 影子密码 Encrypted Password 加密密码 None of the…

将AX寄存器中的16位数据分成4组(从高到低),每组4位,然后把这4组数作为数当中的低4位分别放在AL,BL,CL,DL中。

将AX寄存器中的16位数据分成4组(从高到低),每组4位,然后把这4组数作为数当中的低4位分别放在AL,BL,CL,DL中。 P176 4.14 编程思路:首先用BX、DX存放AX,即原AX原BX原DX&…

一个很不错的wp企业站模板

http://zjuhpp.com/chinese-localization-of-business-wordpress-theme-devster.html转载于:https://www.cnblogs.com/i-kyle/archive/2012/09/13/2683817.html

著名的自由软件圣战- “KDE/QT .VS. Gnome/Gtk”

在 Unix 的图形界面一向是以 MIT 的 X Window 系统为标准, 可是在商业应用上有两大流派,一派是以 Sun 公司领导的 Openlook 阵营,一派是 IBM/HP 领导的OSF (Open Software Foundation) 的 Motif, 双方经过多年竞争之后&#xff0c…

汇编语言-019(汇编程序与c\c++相互调用)

1:在C程序中使用__asm块插入汇编代码程序(不能用LENGTHOF与SIZEOF运算符,而是LENGTH和SIZE) struct Package {long originZip; //4long destinationzip;//4float shippingPrice; //4 };int main(int argcount,char* args[]) {c…

kotlin 判断数字_Kotlin程序检查数字是偶数还是奇数

kotlin 判断数字Given a number N, we have to check whether it is EVEN or ODD. 给定数字N ,我们必须检查它是偶数还是奇数 。 Example: 例: Input:N 13Output:"ODD"Input:N 24Output:"EVEN"程序在Kotlin检查偶数或奇数 (Prog…