1、汇编语言复习资料天津大学王建荣第一章 基本概念1.二进制数数据位从最右边的第0位开始计算,向左依次递增,最左边的位称为最高有效位(MSB),最右边的位称为最低有效位(LSB)。2.整数存储的尺寸在基于IA-32体系结构的计算机中,所有数据存储单位都是字节(byte),每个字节包含8个位,其他存储单位还有字(word,包含2个字节)、双字(doubleword,包含4个字节)和八字节(quadword,包含8个字节)。3.补码表示法二进制整数的补码是惊奇各位取反然后加1得到的,例如8位二进制数字00000001的补码是11111111,计算过程如下:初始值 00000001步骤1:将各位取反 1
2、1111110步骤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 ALEBX BX BH BLECX CX CH CLEDX DX DH DL其余的通用寄存器只有低16位有特别的名字,但是不能再进一步细分了。32位 16位 ESI
3、SI EDI DI EBP BP ESP SP特殊用法:EAX在乘法和除法指令中被自动使用。通常称为扩展累加寄存器;在某些指令中,CPU自动使用ECX作为循环计数器;ESP寻址堆栈(一种系统内存结构)上的数据,极少用于普通的算术运算和数据传送,通常称之为扩展堆栈指针寄存器;ESI和EDI由高速内存数据传送指令使用,通常称为扩展源指针和扩展目的指针寄存器;高级语言使用EBP引用堆栈上的函数参数和局部变量,除非用于高级程序设计技巧中,EBP一般不应该用于普通算术运算和数据传送,通常称为扩展帧指针寄存器。6个16位段寄存器:CS,SS,DS,ES,FS,GS实地址模式下,段寄存器用于存放段的基址,段
4、是一块预分配的内存区域。保护模式下,段寄存器存放段描述符表的指针(索引)。有些段存放程序的指令(代码),有些则存放变量(数据),另外还有其他的段(名为堆栈段)存放着函数的局部变量和函数参数。标志寄存器:EFLAGSEFLAGS(或Flags)寄存器由控制CPU的操作或反映CPU某些运算的结果的独立二进制位构成,有些机器指令可以测试和修改单个处理器标志。进位标志(CF):在无符号算术运算的结果太大而目的操作数无法容纳时置位。溢出标志(OF):在有符号算术运算的结果太大或太小而目的操作数无法容纳时置位。符号标志(SF):在算术或逻辑运算的结果为负时置位。零标志(ZF):在算术或逻辑运算的结果为零时
5、置位。辅助进位标志(AC):在算术运算导致8位操作数的位3到位4产生进位时置位。奇偶标志(PF):结果的最低有效字节为1的位的数目为偶数时置位,否则PF复位。通常PF标志位用于在数据有可能被改变或丢失的情况下进行错误检验。指令指针寄存器:EIPEIP(或称为指令指针)寄存器存放下一条要执行的指令的地址。有些机器指令可以修改EIP,使程序分支转移到新的地址执行。第三章 汇编语言基础1.内部数据类型类型 用途BYTE 8位无符号整数SBYTE 8位有符号整数WORD 16位无符号整数(也可在实地址模式下用做近指针)SWORD 16位有符号整数DWORD 32位无符号整数(也可在保护模式下用做近指针
6、)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) ;20字节,全部等于0BYTE 20 DUP(?) ;20字节,未初始化BYTE 4 DUP(“STACK”) ;
7、20字节节,”STACKSTACKSTACKSTACK”3.计算数组和字符串的大小我们可以让编译器自动为我们计算ListSize的值,MASM用$运算符(当前地址计数器)返回当前程序语句的地址偏移值。夏利中,当前地址值($)减掉list的地址偏移值就得到了ListSize值:list BYTE 10,20,30,40ListSize = ($ - list)ListSize必须紧跟在list之后。如果数组的每个元素都是16位的字,以字节计算的数组总长度必须除以2才能得到数组元素的个数:list WORD 1000h,2000h,3000h,4000hListSize = ($ - list)
8、/ 2与此相似,双字数组的每个元素是4字节长的,因此数组的总长度必须除以4才能得到数组元素的个数:list DWORD 10000000h,20000000h,30000000h,40000000hListSize = ($ - list) / 44.EQU伪指令EQU伪指令将符号名同整数表达式或任意文本联系起来,有以下三种形式:name EQU expressionname EQU symbolname EQU 在第一种格式中,表达式(expression)必须是有效的整数表达式;在第二种格式中,符号(symbol)必须是已用“=”或EQU定义的符号名;第三种格式中,尖括号内可以是任意文本,
9、当汇编器在后面遇到已定义的“名字”(name)时,就用该名字代表的整数值或文本替代。不允许重定义:与“=”伪指令不同,用EQU定义的符号不能在同一源代码文件中重定义,这个限制能够防止已存在的符号被无意中赋了新值。5.TEXTEQU伪指令TEXTEQU伪指令与EQU伪指令非常相似,也可用来创建文本宏(text macro)。它有三种不同的使用格式:第一种格式将文本赋给符号;第二种格式将已定义的文本宏内容赋给符号;第三种格式将整数表达式常量赋给符号。name TEXTEQU name TEXTEQU textmacroname TEXTEQU %constExpr与EQU伪指令不同的是,TEXTE
10、QU可在程序中重定义。第四章 数据传送、寻址和算术操作一、数据传送指令1.操作数类型:立即操作数、寄存器操作数、内存操作数操作数描述r88为通用寄存器:AH,AL,BH,BL,CH,CL,DH,DLr1616位通用寄存器:AX,BX,CX,DX,SI,DI,SP,BPr3232位通用寄存器:EAX,EBX,ECX,EDX,ESI,EDI,ESP,EBPreg任意通用寄存器sreg16位段寄存器r/m88位操作数(可以是8位通用寄存器或内存字节)r/m1616位操作数(可以是8位通用寄存器或内存字节)r/m3232位操作数(可以是8位通用寄存器或内存字节) (详细见书P72)2.MOV指令从源操
11、作数想目的操作数复制数据。指令运行后,目的操作数改变而源操作 数内容不变。MOV destination, source规则:两个操作数尺寸必须一样 两个操作数不能同时为内存操作数 目的操作数不能是CS, EIP,IP 立即数不能直接送至段寄存器例题:解释一下MOV语句为什么无效?.databVal BYTE 100bVal2 BYTE ?wVal WORD 2dVal DWORD 5.code mov ds,45 ;immediate move to DS not permitted mov esi,wVal ;size mismatch mov eip,dVal ;EIP cannot b
12、e the destination mov 25,bVal ;immediate value cannot be destination mov bVal2,bVal ;memory-to-memory move not permitted3.MOVZX指令(move with zero-extend,零扩展传送)指令将源操作数的内容复制到目的操作数中,并将该值零扩展至16位或32 位。该指令只适用于无符号数。三种格式:Movzx r32,r/m8 Movzx r32,r/m16 Movzx r16,r/m8用例:mov bl,10001111bmovzx ax,bl ; zero-exten
13、sion4.MOVSX指令(move with sign-extend,符号扩展传送)指令将源操作数的内容复制到目的操作数中,并将该值符号扩展至16位或 32位。该指令只适用于有符号数。三种格式:Movsx r32,r/m8 Movsx r32,r/m16 Movsx r16,r/m8用例:mov bl,10001111bmovsx ax,bl ; sign extension5.XCHG指令指令交换两个操作数内容。规则:不接受立即操作数 除此之外,与MOV指令遵循同样规则。用例:.datavar1 WORD 1000hvar2 WORD 2000h.codexchg ax,bx ; exch
14、ange 16-bit regsxchg ah,al ; exchange 8-bit regsxchg var1,bx ; exchange mem, regxchg eax,ebx ; exchange 32-bit regsxchg var1,var2 ; error: two memory operands6.直接偏移操作数在变量名称后加上一个偏移值,可以创建直接偏移(direct-offset)操作数,可以通过它访问没有显示标号的内存地址。字节数组,字数组,双字数组的第二个元素与第一个元素的偏移相距分别为1,2,4字节练习题:.datavar1 SBYTE -4,-2,3,1var2
15、 WORD 1000h,2000h,3000h,4000hvar3 SWORD -16,-42var4 DWORD 1,2,3,4,5下列每条指令安顺序执行后,目的操作数的值是什么?mov ax,var2 ;1000hmov ax,var+4 ;3000hmov ax,var3 ;FFF0hmov ax,var3-2 ;4000hmov edx,var4 ;00000001hmov edx,var2 ;00001000hmov edx,var4+4 ;00000002hmov edx,var1 ;FFFFFFFCh二、加法和减法1、INC 和DEC 指令Add 1, subtract 1 fr
16、om destination operand,operand may be register or memoryINC Logic: destination destination + 1DEC Logic: destination destination 1格式:INC reg/memDEC reg/mem用例:.datamyWord WORD 1000hmyDword DWORD 10000000h.code inc myWord ; 1001h dec myWord ; 1000h inc myDword ; 10000001h mov ax,00FFh inc ax ; AX = 01
17、00h mov ax,00FFh inc al ; AX = 0000h练习题:.datamyByte BYTE 0FFh, 0.code mov al,myByte ; AL =FFh mov ah,myByte+1 ; AH =00h dec ah ; AH =FFh inc al ; AL =00h dec ax ; AX = FEFF3.ADD and SUB指令ADD destination, sourceLogic: destination destination + sourceSUB destination, sourceLogic: destination destinati
18、on source用例:.datavar1 DWORD 10000hvar2 DWORD 20000h.code ; -EAX- mov eax,var1 ; 00010000h add eax,var2 ; 00030000h add ax,0FFFFh ; 0003FFFFh add eax,1 ; 00040000h sub ax,1 ; 0004FFFFh4.NEG指令Reverses the sign of an operand. Operand can be a register or memory operand.格式:NEG regNEG mem用例:.datavalB BYT
19、E -1valW WORD +32767.code mov al,valB ; AL = -1 neg al ; AL = +1 neg valW ; valW = -327675.标志位的影响The MOV instruction never affects the flags.加法减法影响的几个标志位: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,1sub cx,1 ; CX = 0, ZF
20、= 1mov ax,0FFFFhinc ax ; AX = 0, ZF = 1inc ax ; AX = 1, ZF = 0Sign flag set when destination is negative (符号标志)The sign flag is a copy of the destinations highest bit:例子:sub al,1 ; AL = 11111111b, SF = 1add al,2 ; AL = 00000001b, SF = 0Carry flag set when unsigned value is out of range (进位标志)用于表示无符号
21、整数运算是否发生溢出。例子:mov al,0FFhadd al,1 ; CF = 1, AL = 00; Try to go below zero:mov al,0sub al,1 ; CF = 1, AL = FFOverflow flag set when signed value is out of range (溢出标志)用于表示有符号数运算是否发生了溢出例子:mov al,7Fh add al,1 ; OF = 1, AL = 80h*判断溢出标志的几个重要结论:*1.符号相同的两个数相加后,和的符号和原数符号相反,则一定发生了溢出。*2.异号的俩数相减,结果的符号和减数相同,则一定
22、发生了溢出。(正-负=负 or 负-正=正 一定发生了溢出) 3.两个加数的符号不同的时候,永远不会发生溢出。练习:1.show the values of the destination operand and the Sign, Zero, and Carry flagsmov ax,00FFhadd ax,1 ; AX= 0100h SF= 0 ZF=0 CF=0sub ax,1 ; AX= 00FFh SF= 0 ZF=0 CF=0add al,1 ; AL= 00h SF= 0 ZF=1 CF=1mov bh,6Chadd bh,95h ; BH= 01h SF= 0 ZF= 0 C
23、F=1mov al,2sub al,3 ; AL= FFh SF= 0 ZF= 0 CF=12.mov al,80h add al,92h ; OF =1 mov al,-2 add al,+127 ; OF =0mov ax,7FF0hadd 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= 1 ZF= 0 OF= 14. mov al,-128neg al ; CF = 1 OF = 1mov ax,8000hadd ax,2 ; CF =0 OF =0mov ax,0s
24、ub ax,2 ; CF =1 OF =0mov al,-5sub al,+125 ; OF =114 数据相关的操作符和伪指令1.OFFSET操作符:返回数据标号的偏移地址用例:.databVal BYTE ?wVal WORD ?dVal DWORD ?dVal2 DWORD ?.codemov esi,OFFSET bVal ; ESI = 00404000mov esi,OFFSET wVal ; ESI = 00404001mov esi,OFFSET dVal ; ESI = 00404003mov esi,OFFSET dVal2 ; ESI = 004040072.PTR操作符
25、:可以重载操作数声明的默认尺寸,在试图以不同于变量声明时 所使用的尺寸属性来访问变量时非常有用。*PTR必须和汇编器的标准数据类型联合使用:BYTE, SBYTE, WORD, SWORD, DWORD, SDWORD, FWORD, QWORD,TBYTE练习:写出目的操作数的值.datavarB BYTE 65h,31h,02h,05hvarW WORD 6543h,1202hvarD DWORD 12345678h.codemov ax,WORD PTR varB+2 ; a.0502hmov bl,BYTE PTR varD ; b.78hmov bl,BYTE PTR varW+2
26、; c.02hmov ax,WORD PTR varD+2 ; d.1234hmov eax,DWORD PTR varW ; e.12026543h3.TYPE操作符:返回按字节计算的变量的单个元素的大小。.datavar1 BYTE ?var2 WORD ?var3 DWORD ?var4 QWORD ?对应的每个TYPE表达式的值表达式值TYPE var11TYPE var22TYPE var33TYPE var44 4、 LENGTHOF操作符:计算数组中元素的数目.data ;LENGTHOF表达式的返回值 byte1 BYTE 10,20,30 ; 3array1 WORD 30
27、DUP(?),0,0 ; 30+2array2 WORD 5 DUP(3 DUP(?) ; 5*3array3 DWORD 1,2,3,4 ; 4digitStr BYTE 12345678,0 ; 9*注意:数组的定义中使用嵌套DUP定义时,LENGTHOF将返回两个计数器的乘积5、 SIZEOF操作符:返回值等于LENGTHOF和TYPE返回值的乘积例子.data SIZEOFbyte1 BYTE 10,20,30 ; 3array1 WORD 30 DUP(?),0,0 ; 64array2 WORD 5 DUP(3 DUP(?) ; 30array3 DWORD 1,2,3,4 ; 1
28、6digitStr BYTE 12345678,0 ; 96.LABEL伪指令Assigns an alternate label name and type to an existing storage locationLABEL does not allocate any storage of its ownRemoves the need for the PTR operator用例:.datadwList LABEL DWORDwordList LABEL WORDintList BYTE 00h,10h,00h,20h.codemov eax,dwList ; 20001000hmo
29、v cx,wordList ; 1000hmov dl,intList ; 00h1. 间接寻址1 间接操作数(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 clarify the size attribute of a memory operand.用例:.datamyCount WORD 0.codemov esi,OFFSET myCountinc es
30、i ; error: ambiguousinc WORD PTR esi ; ok2.变址操作数:把常量和寄存器相加以得到一个有效地址有两种格式:label + reg labelreg用例:.dataarrayW WORD 1000h,2000h,3000h.code mov esi,0 mov ax,arrayW + esi ; AX = 1000h mov ax,arrayWesi ; alternate format add esi,2 add ax,arrayW + esi3.指针:包含其他变量地址的变量用例:.dataarrayW WORD 1000h,2000h,3000hptrW DWORD arrayW.code mov esi,ptrW mov ax,esi ; AX = 1000
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1