Intel汇编_Chapter_04_数据传送、寻址和算术运算.ppt_第1页
Intel汇编_Chapter_04_数据传送、寻址和算术运算.ppt_第2页
Intel汇编_Chapter_04_数据传送、寻址和算术运算.ppt_第3页
Intel汇编_Chapter_04_数据传送、寻址和算术运算.ppt_第4页
Intel汇编_Chapter_04_数据传送、寻址和算术运算.ppt_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第4章 数据传送、寻址和算术运算,要点:,数据传送指令 加法和减法 和数据相关的操作符和伪指令 间接寻址 JMP和LOOP指令,1. 数据传送指令,在汇编语言中,可以(必须)控制任何细节!“权力责任” 汇编编译器给予了声明和移动数据的极大自由,它只进行很少的错误检查!,操作数类型 立即操作数imm 寄存器操作数reg 内存操作数mem,.data var1 byte 10h .code mov al,var1 ;A0 00010400,MOV指令 MOVZX指令 MOVSX指令 LAHF指令 SAHF指令 XCHG指令,1. 数据传送指令,MOV指令,从源操作数向目的操作数拷贝数据mov 目的

2、操作数,源操作数 mov reg/mem, reg mov reg, mem mov mem/reg, imm 两个操作数的尺寸必须一致 两个操作数不能同时为内存操作数 目的操作数不能是CS、EIP和IP 立即数不能直接送段寄存器,mov ax, var1 mov var2, ax,拷贝较小值至较大值中,MOV指令,.data count WORD 1 .code mov ecx , 0 mov cx , count,将16位数32位数; 但仅限于无符号数,.data signedVal SWORD -1 .code mov ecx , 0 mov cx , signedVal,那么对于有符号

3、数呢?,MOVZX指令,将值零扩展 movzx r32,r/m8 movzx r32,r/m16 movzx r16,r/m8 仅适用于无符号数 目的操作数必须是寄存器,mov bx , 0a69bh movzx eax , bx movzx ebx , bl movzx cx, bl,MOVSX指令,将值的符号位扩展 movsx r32,r/m8 movsx r32,r/m16 movsx r16,r/m8 仅适用于有符号数 目的操作数必须是寄存器,mov bx , 0a69bh movsx eax , bx movsx ebx , bl movsx cx, bl,LAHF指令,LAHF(l

4、oad status flags into AH) 将EFLAGS寄存器的低字节拷贝至AH,.data saveflags BYTE ? .code lahf mov saveflags , ah,SAHF指令,SAHF(store AH into status flags ) 拷贝AH寄存器的值至EFLAGS的低字节,.data saveflags BYTE ? .code mov ah , saveflags sahf,XCHG指令,交换两个操作数的内容 xchg reg,reg xchg reg,mem xchg mem,reg 操作数规则遵循与MOV指令的操作数同样的规则,直接偏移操作

5、数,直接偏移操作数 在变量名称后加上一个偏移值 可以通过它来访问没有显式标号的内存地址,.data arrayB BYTE 10h,20h,30h,40h,50h .code mov al , arrayB+2 mov ah, arrayB+1;不要求一定使用方括号 mov bl,arrayB+5; MASM不对有效地址进行范围检查,2. 加法和减法,INC和DEC指令 ADD指令 SUB指令 NEG指令,INC和DEC指令,从操作数中加1或减1 inc reg/mem dec reg/mem,.data myWord WORD 1000h .code inc myWord mov bx,my

6、Word dec bx,不影响CF 影响SF、OF、ZF、PF、AF,ADD指令和SUB指令,将同尺寸的源操作数和目的操作数相加或相减 add 目的操作数,源操作数 sub 目的操作数,源操作数,影响CF、SF、OF、ZF、PF、AF,NEG指令,通过将数字转换为对应的二进制补码而求得其相反数 neg reg neg mem,影响CF、SF、OF、ZF、PF、AF,综合例子,.data Rval SDWORD ? Xval SDWORD 26 Yval SDWORD 30 Zval SDWORD 40 .code mov eax,Xval neg eax mov ebx, Yval sub e

7、ax,Zval add eax, ebx mov Rval, eax,RvalXval (YvalZval),算术运算影响的标志,零标志ZF和符号标志SF 目的操作数被赋以零值的时候,ZF被设置 在运算结果为负的时候,SF被设置 进位标志CF(无符号) 如果无符号运算的结果对目的操作数而言太大(或太小)而无法容纳时,CF被设置 INC和DEC指令并不影响CF 溢出标志OF(有符号) 当算术运算产生的有符号的结果无法容纳于目的操作数时,OF就被设置,3. 和数据相关的操作符和伪指令,OFFSET伪指令 ALIGN伪指令 PTR伪指令 TYPE伪指令 LENGTHOF伪指令 SIZEOF伪指令 L

8、ABEL伪指令,OFFSET伪指令,返回数据标号的偏移地址,单位是字节,.data bVal BYTE ? wVal WORD ? dVal DWORD ? dVal2 DWORD ? myArray WORD 1,2,3,4,.code mov esi, OFFSET bVal mov esi, OFFSET wVal mov esi, OFFSET dVal mov esi, OFFSET dVal2 mov esi, OFFSET myArray+4,ALIGN伪指令,将按变量的位置按字节、字、双字边界对齐 ALIGN 边界值,bVal BYTE ?;0040000 ALIGN 2 wV

9、al WORD ? ;0040002 bVal2 BYTE ? ;0040004,ALIGN 4 dVal DWORD ? ;0040008 dVal2 DWORD ? ;004000C,PTR伪指令,重载操作数的默认尺寸,.data myDouble DWORD 12345678h wordList WORD 5678h, 1234h .code mov ax , myDouble;错误 mov ax , WORD PTR myDouble mov ax , WORD PTR myDouble+2 mov eax , DWORD PTR wordList ; 较大数 较小数,BYTE,SBY

10、TE,WORD, SWORD, DWORD, SDWORD, FWORD, QWORD, TBYTE,TYPE伪指令,返回按字节计算的变量的单个元素的大小,.data val1 BYTE ? val2 WORD ? val3 DWORD ? val4 DWORD ?,LENGTHOF伪指令,计算数组中元素的数目,.data byte1 BYTE 10, 20, 30 ;lengthof byte1:3 array1 WORD 30 DUP(?),0 , 0 ;lengthof array1:30+2 array2 WORD 5 DUP(3 DUP(?) ;lengthof array2:5*3

11、 array3 DWORD 1, 2, 3, 4 ;lengthof array3:4 digitStr BYTE “12345678”, 0 ;lengthof digitStr:9,LENGTHOF伪指令,.data myArray1 BYTE 10, 20, 30, 40, 50 BYTE 60, 70, 80, 90, 100 ;lengthof myArray1:5 myArray2 BYTE 10, 20, 30, 40, 50, 60, 70, 80, 90, 100 ;lengthof myArray2:10,注意“,”,只把第一行的数据的作为数组的组成部分,SIZEOF伪指令

12、,返回值等于LENGTHOF和TYPE返回值的乘积 intArray WORD 32 DUP(0) ;SIZEOF64,LABEL伪指令,允许插入一个标号并赋予其尺寸属性而无需分配任何实际的存储空间 常见用法就是为数据段内已存在的变量提供一个别名,.data val16 LABEL WORD val32 DWORD 12345678h .code mov ax, val16 ;AX= 5678h mov dx, val16+2 ;DX=1234h,BYTE, WORD, DWORD, QWORD, TBYTE,.data LongValue LABEL DWORD val1 WORD 5678

13、h val2 WORD 1234h .code mov eax, LongValue ;EAX= 12345678h,LABEL伪指令,4. 间接寻址,间接寻址(indirect addressing) 处理数组惟一可行的方法是用寄存器作为指针并操纵寄存器的值; 间接操作数 数组 变址操作数 指针,间接操作数,任何用方括号括起来的32位通用寄存器,.data val1 BYTE 10h .code mov esi, OFFSET val1 mov al, esi mov esi, bl inc esi,在保护模式下,如果有效地址指向程序数据段之外的区域,CPU会产生一个GPF,操作数大小不明确

14、 inc BYTE PTR esi,数组,.data arrayB BYTE 10h, 20h, 30h .code mov esi, OFFSET arrayB mov al, esi inc esi mov al, esi inc esi mov al, esi,.data arrayD DWORD 1000h, 2000h, 3000h .code mov esi, OFFSET arrayD mov eax, esi add esi, 4 add eax, esi add esi, 4 add eax, esi,变址操作数,将常量加到寄存器上以产生一个有效地址,任何32位通用寄存器都可

15、以作为指针寄存器,.data arrayB BYTE 10h, 20h, 30h .code mov esi, 0 mov al, arrayB+esi,constantreg constant + reg,指针,arrayB BYTE 10h, 20h, 30h, 40h arrayW WORD 1000h, 2000h, 3000h ptrB BYTE arrayB ptrW DWORD arrayW ;ptrW DWORD OFFSET arrayW,5. JMP和LOOP指令,JMP指令 LOOP指令 整数数组求和 拷贝字符串,1. JMP指令,导致向代码段内的目标地址做无条件转移 J

16、MP 目标标号,top: jmp top,无限循环,2. LOOP指令,提供一种将程序块重复执行特定次数的简单方法 ECX被自动用作计数器,每次循环后减1 LOOP 目标标号,mov ax, 0 mov ecx, 5 L1: inc ax loop L1,注意在循环开始之前不 要随意将ecx初始化为0 循环目的地址与当前地 址只能在相距-128+127 字节的范围之内 循环可以嵌套,但最好 不要多于两层,.data count dword ? .code mov ecx, 100 L1:mov count, ecx mov ecx, 20 L2: loop L1 mov ecx, count

17、loop L2,2. LOOP指令,LOOP/LOOPW LOOPE/LOOPZ ECX减1,如果0设置零标志(ZF),然后跳转到标号处 LOOPNE/LOOPNZ ECX减1,如果0清除零标志(ZF),然后跳转到标号处,3. 整数数组求和,TITLE Summing an Array(SumArray.asm) INCLUDE Irvine32.inc .data intarray WORD 100h, 200h, 300h, 400h .code main PROC mov edi,OFFSET intarray mov ecx, LENGTHOF intarray mov ax, 0 L1:add ax, edi add edi,TYPE intarray loop L1 exit main ENDP END main,4. 拷贝

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论