汇编语言复习资料天津大学王建荣.pdf

上传人:索**** 文档编号:76193481 上传时间:2023-03-08 格式:PDF 页数:44 大小:831.96KB
返回 下载 相关 举报
汇编语言复习资料天津大学王建荣.pdf_第1页
第1页 / 共44页
汇编语言复习资料天津大学王建荣.pdf_第2页
第2页 / 共44页
点击查看更多>>
资源描述

《汇编语言复习资料天津大学王建荣.pdf》由会员分享,可在线阅读,更多相关《汇编语言复习资料天津大学王建荣.pdf(44页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、1 第一章基本概念1.二进制数数据位从最右边的第0 位开始计算,向左依次递增,最左边的位称为最高有效位(MSB),最右边的位称为最低有效位(LSB)。2.整数存储的尺寸在基于IA-32体系结构的计算机中,所有数据存储单位都是字节(byte),每个字节包含8 个位,其他存储单位还有字(word,包含 2 个字节)、双字(doubleword,包含 4 个字节)和八字节(quadword,包含 8 个字节)。3.补码表示法二进制整数的补码是惊奇各位取反然后加1得到的,例如 8位二进制数字 00000001的补码是 11111111,计算过程如下:初始值 00000001 步骤 1:将各位取反 11

2、111110 步骤 2:第一步的结果再加1 11111110+00000001 和:补码 11111111 第二章IA-32 处理器体系结构寄存器8个 32位通用寄存器:EAX,EBX,ECX,EDX,EBP,ESP,ESI,EDI,主要用于算术运算和数据的传送。某些 16位的寄存器能按 8 位值寻址使用。利用,32 位的 EAX寄存器的低 16 位称为 AX,AX寄存器的高 8 位称为 AH,低 8 位称为 AL。32位 16位高 8 位低 8 位EAX AX AH AL EBX BX BH BL ECX CX CH CL EDX DX DH DL 其余的通用寄存器只有低16 位有特别的名字

3、,但是不能再进一步细分了。32 位 16位 ESI SI EDI DI EBP BP ESP SP 特殊用法:2 EAX在乘法和除法指令中被自动使用。通常称为扩展累加寄存器;在某些指令中,CPU 自动使用 ECX作为循环计数器;ESP寻址堆栈(一种系统内存结构)上的数据,极少用于普通的算术运算和数据传送,通常称之为扩展堆栈指针寄存器;ESI和 EDI由高速内存数据传送指令使用,通常称为扩展源指针和扩展目的指针寄存器;高级语言使用EBP引用堆栈上的函数参数和局部变量,除非用于高级程序设计技巧中,EBP一般不应该用于普通算术运算和数据传送,通常称为扩展帧指针寄存器。6 个 16位段寄存器:CS,S

4、S,DS,ES,FS,GS 实地址模式下,段寄存器用于存放段的基址,段是一块预分配的内存区域。保护模式下,段寄存器存放段描述符表的指针(索引)。有些段存放程序的指令(代码),有些则存放变量(数据),另外还有其他的段(名为堆栈段)存放着函数的局部变量和函数参数。标志寄存器:EFLAGS EFLAGS(或 Flags)寄存器由控制 CPU的操作或反映 CPU 某些运算的结果的独立二进制位构成,有些机器指令可以测试和修改单个处理器标志。进位标志(CF):在无符号算术运算的结果太大而目的操作数无法容纳时置位。溢出标志(OF):在有符号算术运算的结果太大或太小而目的操作数无法容纳时置位。符号标志(SF)

5、:在算术或逻辑运算的结果为负时置位。零标志(ZF):在算术或逻辑运算的结果为零时置位。辅助进位标志(AC):在算术运算导致8 位操作数的位 3 到位 4 产生进位时置位。奇偶标志(PF):结果的最低有效字节为1 的位的数目为偶数时置位,否则 PF复位。通常 PF标志位用于在数据有可能被改变或丢失的情况下进行错误检验。指令指针寄存器:EIP EIP(或称为指令指针)寄存器存放下一条要执行的指令的地址。有些机器指令可以修改EIP,使程序分支转移到新的地址执行。第三章 汇编语言基础1.内部数据类型类型用途BYTE 8位无符号整数SBYTE 8位有符号整数WORD 16位无符号整数(也可在实地址模式下

6、用做近指针)SWORD 16位有符号整数DWORD 32位无符号整数(也可在保护模式下用做近指针)3 SDWORD 32 位有符号整数FWORD 48位整数(保护模式下的用做远指针)QWORD 64位整数TBYTE 80位(10 字节)整数REAL4 32位(4 字节)IEEE短实数REAL8 64位(8 字节)IEEE长实数REAL10 80位(10 字节)IEEE扩展精度实数2.DUP 操作符DUP 操作符使用一个常量表达式作为计数器为多个数据项分配存储空间。在为字符串和数组分配空间的时候,DUP 伪指令就十分有用。初始化和未初始化数据均可使用DUP 伪指令定义:BYTE 20 DUP(0

7、);20 字节,全部等于 0 BYTE 20 DUP(?);20 字节,未初始化BYTE 4 DUP(“STACK”);20 字节节,”STACKSTACKSTACKSTACK”3.计算数组和字符串的大小我们可以让编译器自动为我们计算ListSize的值,MASM 用$运算符(当前地址计数器)返回当前程序语句的地址偏移值。夏利中,当前地址值($)减掉 list的地址偏移值就得到了ListSize值:list BYTE 10,20,30,40 ListSize=($-list)ListSize必须紧跟在 list之后。如果数组的每个元素都是16 位的字,以字节计算的数组总长度必须除以 2 才能得

8、到数组元素的个数:list WORD 1000h,2000h,3000h,4000h ListSize=($-list)/2 与此相似,双字数组的每个元素是4 字节长的,因此数组的总长度必须除以 4 才能得到数组元素的个数:list DWORD 10000000h,20000000h,30000000h,40000000h ListSize=($-list)/4 4.EQU 伪指令EQU 伪指令将符号名同整数表达式或任意文本联系起来,有以下三种形式:name EQU expression name EQU symbol name EQU 在第一种格式中,表达式(expression)必须是有效

9、的整数表达式;在第二种格式中,符号(symbol)必须是已用“=”或 EQU 定义的符号名;第三种格式中,尖括号内可以是任意文本,当汇编器在后面遇到已定义的“名字”(name)时,就用该名字代表的整数值或文本替代。4 不允许重定义:与“=”伪指令不同,用EQU 定义的符号不能在同一源代码文件中重定义,这个限制能够防止已存在的符号被无意中赋了新值。5.TEXTEQU 伪指令TEXTEQU 伪指令与 EQU 伪指令非常相似,也可用来创建文本宏(text macro)。它有三种不同的使用格式:第一种格式将文本赋给符号;第二种格式将已定义的文本宏内容赋给符号;第三种格式将整数表达式常量赋给符号。nam

10、e TEXTEQU name TEXTEQU textmacro name TEXTEQU%constExpr 与 EQU 伪指令不同的是,TEXTEQU 可在程序中重定义。第四章数据传送、寻址和算术操作一、数据传送指令1.操作数类型:立即操作数、寄存器操作数、内存操作数(详细见书P72)2.MOV指令从源操作数想目的操作数复制数据。指令运行后,目的操作数改变而源操作数内容不变。MOV destination,source 规则:两个操作数尺寸必须一样两个操作数不能同时为内存操作数目的操作数不能是CS,EIP,IP 立即数不能直接送至段寄存器例题:解释一下 MOV 语句为什么无效?.data

11、bVal BYTE 100 bVal2 BYTE?wVal WORD 2 操作数描述r8 8 为通用寄存器:AH,AL,BH,BL,CH,CL,DH,DL r16 16 位通用寄存器:AX,BX,CX,DX,SI,DI,SP,BP r32 32 位通用寄存器:EAX,EBX,ECX,EDX,ESI,EDI,ESP,EBP reg 任意通用寄存器sreg 16 位段寄存器r/m8 8 位操作数(可以是8 位通用寄存器或内存字节)r/m16 16 位操作数(可以是8 位通用寄存器或内存字节)r/m32 32 位操作数(可以是8 位通用寄存器或内存字节)5 dVal DWORD 5.code mov

12、 ds,45 ;immediate move to DS not permitted mov esi,wVal ;size mismatch mov eip,dVal ;EIP cannot be the destination mov 25,bVal ;immediate value cannot be destination mov bVal2,bVal ;memory-to-memory move not permitted 3.MOVZX指令(move with zero-extend,零扩展传送)指令将源操作数的内容复制到目的操作数中,并将该值零扩展至16位或 32 位。该指令只适用

13、于无符号数。三种格式:Movzx r32,r/m8 Movzx r32,r/m16 Movzx r16,r/m8 用例:mov bl,10001111b movzx ax,bl;zero-extension 4.MOVSX指令(move with sign-extend,符号扩展传送)指令将源操作数的内容复制到目的操作数中,并将该值符号扩展至16 位或 32 位。该指令只适用于有符号数。三种格式:Movsx r32,r/m8 Movsx r32,r/m16 Movsx r16,r/m8 用例:mov bl,10001111b movsx ax,bl ;sign extension 1 0 0

14、0 1 1 1 11 0 0 0 1 1 1 1SourceDestination0 0 0 0 0 0 0 006 5.XCHG指令指令交换两个操作数内容。规则:不接受立即操作数除此之外,与 MOV 指令遵循同样规则。用例:.data var1 WORD 1000h var2 WORD 2000h.code xchg ax,bx ;exchange 16-bit regs xchg ah,al ;exchange 8-bit regs xchg var1,bx ;exchange mem,reg xchg eax,ebx ;exchange 32-bit regs xchg var1,var

15、2 ;error:two memory operands 6.直接偏移操作数在变量名称后加上一个偏移值,可以创建直接偏移(direct-offset)操作数,可以通过它访问没有显示标号的内存地址。字节数组,字数组,双字数组的第二个元素与第一个元素的偏移相距分别为 1,2,4 字节练习题:.data 1 0 0 0 1 1 1 11 0 0 0 1 1 1 1SourceDestination1 1 1 1 1 1 1 17 var1 SBYTE-4,-2,3,1 var2 WORD 1000h,2000h,3000h,4000h var3 SWORD-16,-42 var4 DWORD 1,2

16、,3,4,5 下列每条指令安顺序执行后,目的操作数的值是什么?mov ax,var2 ;1000h mov ax,var+4 ;3000h mov ax,var3 ;FFF0h mov ax,var3-2 ;4000h mov edx,var4 ;00000001h mov edx,var2 ;00001000h mov edx,var4+4 ;00000002h mov edx,var1 ;FFFFFFFCh 二、加法和减法1、INC 和 DEC 指令Add 1,subtract 1 from destination operand,operand may be register or me

17、mory INC Logic:destination DEC Logic:destination 1 格式:INC reg/mem DEC reg/mem 用例:.data myWord WORD 1000h myDword DWORD 10000000h.code inc myWord ;1001h dec myWord;1000h inc myDword;10000001h mov ax,00FFh inc ax;AX=0100h mov ax,00FFh inc al;AX=0000h 练习题:8.data myByte BYTE 0FFh,0.code mov al,myByte ;A

18、L=FFh mov ah,myByte+1;AH=00h dec ah ;AH=FFh inc al ;AL=00h dec ax ;AX=FEFF 3.ADD and SUB 指令ADD destination,source Logic:destination SUB destination,source Logic:destination source 用例:.data var1 DWORD 10000h var2 DWORD 20000h.code ;-EAX-mov eax,var1 ;00010000h add eax,var2 ;00030000h add ax,0FFFFh;00

19、03FFFFh add eax,1 ;00040000h sub ax,1 ;0004FFFFh 4.NEG指令Reverses the sign of an operand.Operand can be a register or memory operand.格式:NEG reg NEG mem 用例:.data valB BYTE-1 valW WORD+32767.code mov al,valB;AL=-1 9 neg al ;AL=+1 neg valW ;valW=-32767 5.标志位的影响?The MOV instruction never affects the flag

20、s.?加法减法影响的几个标志位:Zero flag set when destination equals zero(零标志)?A flag is set when it equals 1.?A flag is clear when it equals 0.例子:mov cx,1 sub cx,1 ;CX=0,ZF=1 mov ax,0FFFFh inc ax ;AX=0,ZF=1 inc ax ;AX=1,ZF=0 Sign flag set when destination is negative (符号标志)The sign flag is a copy of the destinati

21、ons highest bit:例子:sub al,1 ;AL=11111111b,SF=1 add al,2 ;AL=00000001b,SF=0 Carry flag set when unsigned value is out of range (进位标志)用于表示无符号整数运算是否发生溢出。例子:mov al,0FFh add al,1;CF=1,AL=00;Try to go below zero:mov al,0 sub al,1;CF=1,AL=FF Overflow flag set when signed value is out of range (溢出标志)用于表示有符号

22、数运算是否发生了溢出例子:mov al,7Fh add al,1 ;OF=1,AL=80h*判断溢出标志的几个重要结论:10*1.符号相同的两个数相加后,和的符号和原数符号相反,则一定发生了溢出。*2.异号的俩数相减,结果的符号和减数相同,则一定发生了溢出。(正-负=负or 负-正=正一定发生了溢出)3.两个加数的符号不同的时候,永远不会发生溢出。练习:1.show the values of the destination operand and the Sign,Zero,and Carry flags mov ax,00FFh add ax,1;AX=0100h SF=0 ZF=0 CF

23、=0 sub ax,1;AX=00FFh SF=0 ZF=0 CF=0 add al,1;AL=00h SF=0 ZF=1 CF=1 mov bh,6Ch add bh,95h;BH=01h SF=0 ZF=0 CF=1 mov al,2 sub al,3 ;AL=FFh SF=0 ZF=0 CF=1 2.mov al,80h add al,92h;OF=1 mov al,-2 add al,+127;OF=0 mov ax,7FF0h add al,10h ;CF=1 SF=0 ZF=1 OF=0 add ah,1 ;CF=0 SF=1 ZF=0 OF=1 add ax,2 ;CF=0 SF

24、=1 ZF=0 OF=1 4.mov al,-128 neg al;CF=1 OF=1 mov ax,8000h add ax,2;CF=0 OF=0 mov ax,0 11 sub ax,2;CF=1 OF=0 mov al,-5 sub al,+125;OF=1 14数据相关的操作符和伪指令1.OFFSET 操作符:返回数据标号的偏移地址用例:.data bVal BYTE?wVal WORD?dVal DWORD?dVal2 DWORD?.code mov esi,OFFSET bVal ;ESI=00404000 mov esi,OFFSET wVal ;ESI=00404001 mo

25、v esi,OFFSET dVal ;ESI=00404003 mov esi,OFFSET dVal2;ESI=00404007 2.PTR 操作符:可以重载操作数声明的默认尺寸,在试图以不同于变量声明时所使用的尺寸属性来访问变量时非常有用。*PTR 必 须 和 汇 编 器的 标准 数据 类型 联合 使 用:BYTE,SBYTE,WORD,SWORD,DWORD,SDWORD,FWORD,QWORD,TBYTE 练习:写出目的操作数的值.data varB BYTE 65h,31h,02h,05h varW WORD 6543h,1202h varD DWORD 12345678h.code

26、 mov ax,WORD PTR varB+2 ;a.0502h mov bl,BYTE PTR varD ;b.78h mov bl,BYTE PTR varW+2 ;c.02h 12 mov ax,WORD PTR varD+2 ;d.1234h mov eax,DWORD PTR varW ;e.12026543h 3.TYPE 操作符:返回按字节计算的变量的单个元素的大小。.data var1 BYTE?var2 WORD?var3 DWORD?var4 QWORD?对应的每个 TYPE 表达式的值4、LENGTHOF 操作符:计算数组中元素的数目.data ;LENGTHOF表达式的

27、返回值byte1 BYTE 10,20,30 ;3 array1 WORD 30 DUP(?),0,0 ;30+2 array2 WORD 5 DUP(3 DUP(?);5*3 array3 DWORD 1,2,3,4 ;4 digitStr BYTE 12345678,0 ;9*注意:数组的定义中使用嵌套DUP 定义时,LENGTHOF 将返回两个计数器的乘积5、SIZEOF 操作符:返回值等于 LENGTHOF 和 TYPE 返回值的乘积例子.data SIZEOF byte1 BYTE 10,20,30 ;3 array1 WORD 30 DUP(?),0,0 ;64 array2 WO

28、RD 5 DUP(3 DUP(?);30 array3 DWORD 1,2,3,4 ;16 表达式值TYPE var1 1 TYPE var2 2 TYPE var3 3 TYPE var4 4 13 digitStr BYTE 12345678,0 ;9 6.LABEL 伪指令?Assigns an alternate label name and type to an existing storage location?LABEL does not allocate any storage of its own?Removes the need for the PTR operator 用

29、例:.data dwList LABEL DWORD wordList LABEL WORD intList BYTE 00h,10h,00h,20h.code mov eax,dwList;20001000h mov cx,wordList;1000h mov dl,intList ;00h 1.间接寻址0间接操作数(1)An indirect operand holds the address of a variable,usually an array or string.It can be dereferenced (just like a pointer).(2)Use PTR to

30、 clarify the size attribute of a memory operand.用例:.data myCount WORD 0.code mov esi,OFFSET myCount inc esi ;error:ambiguous inc WORD PTR esi ;ok 2.变址操作数:把常量和寄存器相加以得到一个有效地址有两种格式:label+reg labelreg 用例:.data 14 arrayW WORD 1000h,2000h,3000h.code mov esi,0 mov ax,arrayW+esi ;AX=1000h mov ax,arrayWesi ;

31、alternate format add esi,2 add ax,arrayW+esi 3.指针:包含其他变量地址的变量用例:.data arrayW WORD 1000h,2000h,3000h ptrW DWORD arrayW.code mov esi,ptrW mov ax,esi;AX=1000h 练习题:书 P96 第 7 题,第 8 题 作业题5、JMP 和 LOOP 1.JMP 指令导致向代码段内的目的地址做无条件转移。目的标号的偏移地址被装入指令指针中。格式:JMP 目的地址JMP指令是无条件的,因此循环会屋休止地持续下去,知道满足其他条件退出为止。创建一个循环top:.j

32、mp top ;无限循环2.LOOP指令:重复执行一块语句,执行的次数是特定的。ECX 被自动用作计数器,在每次循环后减1 格式:LOOP 目的地址执行 LOOP 指令两步:15 首先 ECX 减 1 接着,与 0 比较。如果 ECX!=0,跳转到目的地址;如果 ECX=0,不发生跳转。注 意:循 环 开 始 之 前 将 ECX 初 始 化 为0,结 果循 环4292967296次。循 环 的 目 的 地址 与 当 前地 址 只 能 在 相 距-128+127字节范围内。3.循环的嵌套:.data count DWORD?.code mov ecx,100 ;set outer loop co

33、unt L1:mov count,ecx ;save outer loop count mov ecx,20 ;set inner loop count L2:.loop L2 ;repeat the inner loop mov ecx,count ;restore outer loop count loop L1 ;repeat the outer loop 例题:书P98 整数数组求和书P99 复制字符串第五章过程一与数据库链接链接库是一个文件,其中包含了已经编译成机器码的过程命令:link hello.obj irvine32.lib 二书中的链接库CloseFile Closes a

34、n open disk file Clrscr-Clears console,locates cursor at upper left corner CreateOutputFile-Creates new disk file for writing in output mode Crlf-Writes end of line sequence to standard output 16 Delay-Pauses program execution for n millisecond interval DumpMem-Writes block of memory to standard out

35、put in hex DumpRegs Displays general-purpose registers and flags(hex)GetCommandtail-Copies command-line args into array of bytes GetMaxXY-Gets number of cols,rows in console window buffer GetMseconds-Returns milliseconds elapsed since midnight GetTextColor-Returns active foreground and background te

36、xt colors in the console window Gotoxy-Locates cursor at row and column on the console IsDigit-Sets Zero flag if AL contains ASCII code for decimal digit(0 9)MsgBox,MsgBoxAsk Display popup message boxes OpenInputFile Opens existing file for input ParseDecimal32 Converts unsigned integer string to bi

37、nary ParseInteger32-Converts signed integer string to binary Random32-Generates 32-bit pseudorandom integer in the range 0 to FFFFFFFFh Randomize-Seeds the random number generator RandomRange-Generates a pseudorandom integer within a specified range ReadChar-Reads a single character from standard in

38、put ReadFromFile Reads input disk file into buffer ReadDec-Reads 32-bit unsigned decimal integer from keyboard ReadHex-Reads 32-bit hexadecimal integer from keyboard ReadInt-Reads 32-bit signed decimal integer from keyboard ReadKey Reads character from keyboard input buffer ReadString-Reads string f

39、rom standard input,terminated by Enter SetTextColor-Sets foreground and background colors of all subsequent console text output StrLength Returns length of a string WaitMsg-Displays message,waits for Enter key to be pressed WriteBin-Writes unsigned 32-bit integer in ASCII binary format.WriteBinB Wri

40、tes binary integer in byte,word,or doubleword format WriteChar-Writes a single character to standard output WriteDec-Writes unsigned 32-bit integer in decimal format WriteHex-Writes an unsigned 32-bit integer in hexadecimal format WriteHexB Writes byte,word,or doubleword in hexadecimal format WriteI

41、nt-Writes signed 32-bit integer in decimal format WriteString-Writes null-terminated string to console window WriteToFile-Writes buffer to output file 17 WriteWindowsMsg-Displays most recent error message generated by MS-Windows Example 1.data fileName BYTE 80 DUP(0)nameCount DWORD?.code mov edx,OFF

42、SET fileName mov ecx,SIZEOF fileName 1 call ReadString mov nameCount,eax Example 2 反转字符串TITLE Reversing a String INCLUDE Irvine32.inc.data aName BYTE“Abranham Lincoln”,0 nameSize=($-aName)-1.code main PROC move cx,nameSize mov esi,0 L1:movzx eax,aNameesi push eax inc esi loop L1 mov ecx,nameSize mov

43、 esi,0 L2:pop eax mov aNameesi,al inc esi loop L2 move dx,OFFSET aName call WriteString call Crlf exit main ENDP 18 END main 三堆栈操作运行时栈是由 cpu 直接管理的内存数组,它使用两个寄存器:SS 和ESP。在保护模式下 SS 寄存器存放的是段选择子,用户模式程序不应对其进行修改。ESP 寄存器存放的是指向特定位置的一个32 位偏移地址。很少需要直接操纵ESP的值,通常是由CALL,RET,PUSH 和 POP 等指令间接修改的。保护模式下,每个堆栈位置包含 32 个

44、数据位。实地址模式下,每个堆栈位置包含 16 个数据位。规则:从顶部出栈,从顶部压栈,后进先出 LIFO 1.PUSH 操作首先将堆栈指针减4(32bits),然后把要压栈的值复制到堆栈指针所指的位置处。堆栈向下增长。2.POP 操作首先从堆栈顶端移走一个值并将其复制到寄存器或内存变量中,在值从栈顶弹出之后,堆栈指针相应增加,并指向栈中与弹出数据相邻的高位置。19 3.堆栈的应用:a用作寄存器值的临时保存区域,在寄存器使用完毕后,通过堆栈恢复原始值。bCALL 指令执行时,CPU 用堆栈保存当前被调用过程的返回地址。c 调用过程时,通过堆栈传递参数。d过程内的局域变量在堆栈上创建,过程结束后,

45、变量被丢弃。4.指令格式:PUSH r/m16 PUSH r/m32 PUSH imm32 POP r/m16 POP r/m32 5.PUSHFD 和 POPFD 对 EFLAGS 寄存器的值进行压栈和出栈。(MOV 指令不能复制标志寄存器的值至变量或寄存 器 中,因 此 使 用 PUSHFD 指 令 可 以 保 存 标 志 寄 存器)。使用指令时,要保障程序执行罗京不会跳过POPFD 指令。6.PUSHAD 和 POPAD PUSHAD 指令在堆栈上按顺序压入所有32 位通用寄存器的值:EAX ECX EDX EBX ESP POPAD 指令以相反顺序从堆栈中弹出这些通用寄存器。PUSHA

46、 和 POPA 对 16 位寄存器做相同操作(AX CX DX BX SP)。7.嵌套循环当使用嵌套循环时,在进入内部循环时将外部循环的计数器压栈(ecx)20 四过程的定义和使用1.CALL 和 RET 指令CALL 指令把返回地址压入堆栈并把被调用过程的地址复制到指令指针寄存器中。在新的内存地址执行指令,以实现对过程的调用。RET 指令从堆栈中弹出返回地址并送到指令寄存器中,使处理器返回到程序中过程被调用的地方继续执行。32 位模式下,CPU 总是执行EIP 寄存器所指向的内存地址处得指令(16 位-IP 寄存器)2.传递参数Example 求 数 组 和ArraySum PROC;Rec

47、eives:ESI points to an array of doublewords,;ECX=number of array elements.;Returns:EAX=sum 21 push esi push ecx mov eax,0;set the sum to zero L1:add eax,esi;add each integer to sum add esi,4;point to next integer loop L1;repeat for array size pop ecx pop esi ret ArraySum ENDP.data array DWORD 1000h,

48、2000h,3000h,4000h,5000h theSum DWORD?.code main PROC mov esi,OFFSET array mov ecx,LENGTHOF array call ArraySum mov theSum,eax 五保存和恢复寄存器USES 操作符允许列出被过程修改的所有寄存器首先,在过程开始处生成PUSH 指令在堆栈上保存寄存器;其次,在过程的结束处生成POP 指令恢复这些寄存器的值例:ArraySum PROC USES esi ecx mov eax,0;set the sum to zero etc.汇编器生成的相应代码ArraySum PROC

49、push esi push ecx.22 pop ecx pop esi ret ArraySum ENDP 当过程要使用寄存器作为返回值的时候,不要将用于返回值的寄存器压栈和弹出,这会使返回值丢失。SumOf PROC;sum of three integers push eax add eax,ebx add eax,ecx pop eax;EAX 中的和丢失ret SumOf ENDP 六流程图23 24 第六章条件处理(一)、布尔指令和比较指令:1.and,or,xor 指令格式相同,都和mov指令的格式相同。2.and,or,xor 指令总是清除溢出标志和进位标志。3.and 指令常

50、用来清除选定的位并同时保留其他位。4.or 指令常用来设置位并保留其他的位。5.not 指令对一个操作数数据位求反。6.cmp 指令在两个操作数执行隐含的减法操作,两个操作数都不会被修改。7.xor指令的一个特性是:某个操作数与同样的操作数执行异或运算,其值不变,xor 的这种特性可以进行简单的加密。(二)、各种指令应用展示:1.Task:Convert the character in AL to upper case.Solution:Use the AND instruction to clear bit 5.mov al,a;AL=01100001b and al,11011111b;

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 实施方案

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁