




已阅读5页,还剩54页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1计算机科学系汇编课件 第4章 数据传送、寻址和算术运算 要点: 1. 数据传送指令 2. 加法和减法 3. 和数据相关的操作符和伪指令 4. 间接寻址 5. JMP和LOOP指令 2计算机科学系汇编课件 MOV指令 MOVZX指令 MOVSX指令 LAHF指令 SAHF指令 XCHG指令 4.1 数据传送指令 3计算机科学系汇编课件 4.1.2 操作数类型 操作数类型 立即操作数 寄存器操作数 内存操作数 指令中操作数的表示法 P72 表4.1 4计算机科学系汇编课件 4.1.3 直接内存操作数 变量名仅仅是对数据段内偏移的简单引用 例如: .data var1 BYTE 10h .code mov al, var1 变量名代表一个内存地址,该内存单元存放的值为10h; 这条指令表示将var1内存单元的内容送给寄存器al。 5计算机科学系汇编课件 4.1.4 MOV指令 MOV指令 从源操作数向目的操作数拷贝数据 mov 目的操作数,源操作数 mov reg/mem, reg mov reg, mem mov mem/reg, imm 两个操作数的尺寸必须一致 两个操作数不能同时为内存操作数 目的操作数不能是CS、EIP和IP 立即数不能直接送段寄存器 mov ax, var1 mov var2, ax 6计算机科学系汇编课件 拷贝较小值至较大值中 例如:将count(无符号16位数)送到ECX中 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 那么对于有符号数 呢? 7计算机科学系汇编课件 4.1.5 MOVZX指令 MOVZX指令 零扩展传送 movzx r32,r/m8 movzx r32,r/m16 movzx r16,r/m8 适用于无符号整数的传送 目的操作数必须是寄存器 mov bx , 0a69bh movzx eax , bx ;eax=0000a69bh movzx edx , bl ;edx=0000009bh movzx cx, bl ;cx=009bh 8计算机科学系汇编课件 4.1.5 MOVSX指令 MOVSX指令 符号扩展传送 movsx r32,r/m8 movsx r32,r/m16 movsx r16,r/m8 适用于有符号整数的传送 目的操作数必须是寄存器 mov bx , 0a69bh movsx eax , bx ;eax=ffffa69bh movsx ebx , bl ;edx=ffffff9bh movsx cx, bl ;cx=ff9bh 9计算机科学系汇编课件 LAHF指令 LAHF(load status flags into AH) 将EFLAGS寄存器的低字节拷贝至AH,被拷贝的标 志包括:符号标志SF、零标志ZF、辅助进位标志AC 、奇偶标志PF和进位标志CF。 .data saveflags BYTE ? .code lahf mov saveflags , ah 10计算机科学系汇编课件 SAHF指令 SAHF(store AH into status flags ) 拷贝AH寄存器的值至EFLAGS的低字节 .data saveflags BYTE ? .code lahf mov saveflags , ah mov ah , saveflags sahf 例如:用如下指令恢复刚才保存在变量中的标志 11计算机科学系汇编课件 XCHG指令 XCHG指令:交换两个操作数的内 容 xchg reg,reg xchg reg,mem xchg mem,reg 操作数规则遵循与MOV指令的 操作数同样的规则。 xchg ax , bx xchg ah , al xchg var1 , bx xchg eax, ebx mov ax , var1 xchg ax , var2 mov var1 , ax 交换两个内存操作数 仍需使用寄存器 12计算机科学系汇编课件 4.1.8 直接偏移操作数 arrayB BYTE 10h, 20h, 30h, 40h, 50h mov al, arrayB ;al=10h mov al, arrayB+1 ;al=20h mov al, arrayB+5 mov al, arrayB+1 有效地址,通常用方 括号括起来 MASM并不一定要求 使用方括号 MASM对有效地址并不进行范围检查,编 译器返回数组之外的一个字节 不同类型时,偏移地址不同 形如 变量名+偏移值 的操作数称为直接偏移操作数, 可以访问没有显式标号的内存地址。 13计算机科学系汇编课件 4.1.8 直接偏移操作数 arrayW WORD 100h, 200h, 300h mov ax, arrayW ;ax=100h mov al, arrayW+2 ;ax=200h arrayD DWORD 10000h, 20000h mov eax, arrayD ;eax=10000h mov eax, arrayD+4 ;eax=20000h 14计算机科学系汇编课件 4.2 加法和减法 INC和DEC指令 ADD指令 SUB指令 NEG指令 15计算机科学系汇编课件 INC和DEC指令 INC指令(DEC)从操作数中加1(减1) inc reg/mem dec reg/mem .data myWord WORD 1000h .code inc myWord ; myword=1001h mov bx,myWord dec bx ; bx=1000h 16计算机科学系汇编课件 ADD指令和SUB指令 ADD指令将同尺寸的源操作数和目的操作数相加。 格式为: add 目的操作数,源操作数 加法操作并不改变源操作数,结果存储在目的操作数中 。 影响的标志:ADD指令根据目的操作数的值相应修改进 位标志、零标志、符号标志、溢出标志、辅助进位标志 和奇偶标志。 17计算机科学系汇编课件 例如: .data var1 DWORD 10000h var2 DWORD 20000h .code mov eax, var1 add eax, var2 ; eax=30000h,var1=10000h,var2=20000h CF=0,SF=0,ZF=0,OF=0 18计算机科学系汇编课件 ADD指令和SUB指令 SUB指令将源操作数从目的操作数中减掉。 格式为: sub 目的操作数,源操作数 影响的标志:SUB指令根据目的操作数的值相应修改进位标志、 零标志、符号标志、溢出标志、辅助进位标志和奇偶标志。 例如: .data var1 DWORD 30000h var2 DWORD 10000h .code mov eax, var1 sub eax, var2 ; eax=20000h,var1=30000h,var2=10000h CF=0,SF=0,ZF=0,OF=0 19计算机科学系汇编课件 NEG指令 NEG指令将数字转换为对应的二进制补码,从而 求得其相反数。 影响的标志位同ADD指令。 neg reg neg mem 20计算机科学系汇编课件 加减运算示例 .data Rval SDWORD ? Xval SDWORD 26 Yval SDWORD 30 Zval SDWORD 40 .code mov eax,Xval neg eax mov ebx, Yval sub ebx,Zval add eax, ebx mov Rval, eax RvalXval (YvalZval) 21计算机科学系汇编课件 4.2.6 算术运算影响的标志 零标志ZF和符号标志SF 目的操作数被赋以零值的时候,零标志被设置。 例如: 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 在运算结果为负的时候,符号标志被设置。 例如: mov cx ,0 sub cx, 1 ; CX=-1, SF=1 add cx, 2 ; CX=1, SF=0 22计算机科学系汇编课件 4.2.6 算术运算影响的标志 进位标志CF(无符号算术运算) 如果无符号运算的结果对目的操作数而言太大(或太 小)而无法容纳时,进位标志被设置。 例如: mov al, 0ffh add al, 1 ; CF=1, AL=00h mov ax, 00ffh add ax, 1 ; CF=0, AX=0100h mov ax, 0ffffh add ax, 1 ; CF=1, AX=0000h INC和DEC指令并不影响进位标志。 23计算机科学系汇编课件 4.2.6 算术运算影响的标志 溢出标志OF(有符号算术运算) 当算术运算产生的有符号的结果无法容纳于目的操作 数时,溢出标志就被设置。 例如:一个字节所能存储的最大有符号值是+127,如果 再加1的话,溢出标志就会设置: mov al, +127 add al, 1 ; OF=1 类似的,一个字节所能容纳的最小数是-128,如果再减 1,溢出标志也会被设置: mov al, -128 sub al, 1 ; OF=1 24计算机科学系汇编课件 加法测试: 两个正数相加的和是负数则溢出,OF=1 两个负数相加的和是正数则溢出,OF=1 一正一负相加则不溢出,OF=0 CPU如何检测溢出:将位6和位7的进位值进行异或运算 ,根据结果设置溢出标志。 例如: 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 0 7 6 OF=1 + = 两负相加为正则溢出 25计算机科学系汇编课件 4.3 和数据相关的操作符和伪指令 OFFSET伪指令 ALIGN伪指令 PTR伪指令 TYPE伪指令 LENGTHOF伪指令 SIZEOF伪指令 LABEL伪指令 26计算机科学系汇编课件 OFFSET伪指令 返回数据标号的偏移地址,偏移地址代表标号距数据 段开始的距离,单位是字节。 在保护模式下偏移总是32位;而实地址模式下偏移只 有16位。 .data bVal BYTE ? wVal WORD ? dVal DWORD ? dVal2 DWORD ? 如果bVal位于00404000h处: .code mov esi, OFFSET bVal ;esi=00404000 mov esi, OFFSET wVal ;esi=00404001 mov esi, OFFSET dVal ;esi=00404003 mov esi, OFFSET dVal2 ;esi=00404007 27计算机科学系汇编课件 OFFSET操作符也可以和直接偏移操作数联合使用。 .data myArray WORD 1, 2, 3, 4, 5 .code mov esi, OFFSET myArray+4 28计算机科学系汇编课件 ALIGN伪指令 将变量的位置按字节、字、双字边界对齐。格式: ALIGN 边界值 ;边界值可以是1,2,4 bVal BYTE ? ; 00404000 ALIGN 2 wVal WORD ? ; 00404002 bVal2 BYTE ? ; 00404004 ALIGN 4 dVal DWORD ?; 00404008 dVal2 DWORD ? ; 0040400C dVal本应在地址 00404005处,但是 ALIGN 4伪指令使其 地址开始于00404008 29计算机科学系汇编课件 PTR伪指令 重载操作数的默认尺寸 .data myDouble DWORD 12345678h .code mov ax , myDouble ;错误 mov ax , WORD PTR myDouble ;ax=5678h mov ax , WORD PTR myDouble+2 ;ax=1234h 注意:按小尾顺序存放 30计算机科学系汇编课件 .data wordList WORD 5678h, 1234h .code mov eax , DWORD PTR wordList ;eax=12345678h 使用PTR伪指令将较小值送到较大的目的操作数中 : 31计算机科学系汇编课件 TYPE伪指令 返回按字节计算的变量的单个元素的大小 表达式值值 TYPE var11 TYPE var22 TYPE var34 TYPE var48 .data val1 BYTE ? val2 WORD ? val3 DWORD ? val4 QWORD ? 32计算机科学系汇编课件 LENGTHOF伪指令 计算数组中元素的数目,数组是由出现同一行左边的 标号定义的。 表达式值值 lengthof byte13 lengthof array1 30+2 lengthof array2 5*3 lengthof array3 4 lengthof digitStr 9 .data byte1 BYTE 10, 20, 30 array1 WORD 30 DUP(?) , 0 , 0 array2 WORD 5 DUP(3 DUP(?) array3 DWORD 1, 2, 3, 4 digitStr BYTE “12345678”, 0 33计算机科学系汇编课件 .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 如果声明了一个跨多行的数组,LENGTHOF只把第 一行的数据作为数组的组成部分。 也可以在第一行的最后加一个逗号,以连接下一行。 34计算机科学系汇编课件 SIZEOF伪指令 返回值等于LENGTHOF和TYPE返回值的乘积 intArray WORD 32 DUP(0) intArray的TYPE等于2,其LENGTHOF等于32,因此 SIZEOF intArray等于64。 35计算机科学系汇编课件 LABEL伪指令 允许插入一个标号并赋予其尺寸属性而无需分配任何实 际的存储空间。 常见用法就是为数据段内已存在的变量提供一个别名。 val16仅仅是和val32同以地址的存储空间的一个别名, LABEL伪指令本身并不占用实际存储空间。 .data val16 LABEL WORD val32 DWORD 12345678h .code mov ax, val16 ;AX= 5678h mov dx, val16+2 ;DX=1234h 36计算机科学系汇编课件 有时需要用两个较小的整数构造一个较大的整数: .data LongValue LABEL DWORD val1 WORD 5678h val2 WORD 1234h .code mov eax, LongValue ; EAX=12345678h 37计算机科学系汇编课件 本节练习 P78 4.1.10 P86 4.2.8 P90 4.3.8 38计算机科学系汇编课件 4.4 间接寻址 间接寻址(indirect addressing):用寄存器作为指针并 操纵寄存器的值。存放地址的寄存器称为间接操作数。 间接操作数 数组 变址操作数 指针 39计算机科学系汇编课件 4.4.1 间接操作数 间接操作数可以是任何用方括号括起来的32位通用寄存器 ,寄存器里存放着数据的偏移。 间接操作数作为目的操作数,一个新值将被存放在寄存器 所指向的内存位置。 例如:mov esi, BL .data val1 BYTE 10h .code mov esi, OFFSET val1 mov al, esi ; AL =10h 40计算机科学系汇编课件 通用保护故障:在保护模式下,如果有效地址指向 程序数据段之外的区域,CPU就会产生一个通用保 护故障。 例如,如果ESI未初始化,下面的指令就可能产生 通用保护故障: mov ax, esi 使用作为间接操作数的寄存器应对其进行初始化! 41计算机科学系汇编课件 PTR与间接操作数的联合使用 有时在一条指令的上下文中,操作数的大小通常并不 明确。例如: inc esi 产生编译错误,因为编译器并不知道ESI是指向一个 字节、一个字还是一个双字。 需使用PTR操作符来明确表示操作数的尺寸: inc BYTE PTR esi 42计算机科学系汇编课件 4.4.2 数组 .data arrayB BYTE 10h, 20h, 30h .code mov esi, OFFSET arrayB mov al, esi ;AL=10h inc esi mov al, esi ; AL=20h inc esi mov al, esi ; AL=30h .data arrayW WORD 1000h,2000h, 3000h .code mov esi, OFFSET arrayW mov ax, esi ; AX=1000h add esi, 2 add eax, esi ; AX=2000h add esi, 2 add eax, esi ; AX=3000h 与数组下标类似,间接操作数可以指向数组的不同元素 43计算机科学系汇编课件 .data arrayD DWORD 10000h, 20000h, 30000h .code mov esi, OFFSET arrayD mov eax, esi ; eax=10000h add esi, 4 add eax, esi ; eax=20000h add esi, 4 add eax, esi ; eax=30000h 44计算机科学系汇编课件 4.4.3 变址操作数 变址操作数是指将常量加到寄存器上以产生一个有效 地址。任何32位通用寄存器都可以作为指针寄存器。 MASM允许两种格式的变址操作数: constantreg constant + reg 其中constant是代表变量偏移地址的常量,reg代表寄 存器。 45计算机科学系汇编课件 .data arrayB BYTE 10h, 20h, 30h .code mov esi, 0 mov al, arrayB+esi ;AL=10h 46计算机科学系汇编课件 .data arrayW WORD 1000h, 2000h, 3000h .code mov esi, OFFSET arrayW mov ax, esi ; AX=1000h mov ax, esi+2 ; AX=2000h mov ax, esi+4 ; AX=3000h 47计算机科学系汇编课件 4.4.4 指针 16位模式32位模式 NEAR指针 相对数据段开始的16位 偏移地址 相对数据段开始的32 位偏移地址 FAR指针32位的段偏移地址48位的段偏移地址 本书中的保护模式程序使用NEAR 指针,所以被存储在双字变量中。 包含其他变量地址的变量称为指针变量或指针。 基于Intel的程序使用两种基本类型的指针:NEAR 和FAR。 48计算机科学系汇编课件 arrayB BYTE 10h, 20h, 30h, 40h arrayW WORD 1000h, 2000h, 3000h ptrB DWORD arrayB ;ptrB包含arrayB的偏移地址 ptrW DWORD arrayW ;ptrW包含arrayW的偏移地址 另外,还可以使用OFFSET操作符使关系更加清晰: ptrB DWORD OFFSET arrayB ptrW DWORD OFFSET arrayW 49计算机科学系汇编课件 TYPEDEF操作符 用于创建用户自定义类型。 例如:创建指向字节的指针PBYTE PBYTE TYPEDEF PTR BYTE 指针类型的声明一般置于程序的开始处,在数据段之前。此后, 就可以使用PBYTE来定义变量了: .data arrayB BYTE 10h, 20h, 30h, 40h ptr1 PBYTE ? ;未初始化 ptr2 PBYTE arrayB ;指向数组 PBYTE TYPEDEF PTR BYTE PWORD TYPEDEF PTR WORD PDWORD TYPEDEF PTR DWORD .data arrayB BYTE 10h, 20h, 30h arrayW WORD 1, 2, 3 arrayD DWORD 4, 5, 6 ptr1 PBYTE arrayB ptr2 PWORD arrayW ptr3 PDWORD arrayD .code mov esi, ptr1 mov al, esi ; 10h mov esi, ptr2 mov ax, esi ; 1 mov esi, ptr3 mov eax, esi ; 4 使用TYPEDEF创建三种 指针类型 使用指针类型创建指针变量 利用指针变量进行寻址 51计算机科学系汇编课件 4.5 JMP和LOOP指令 JMP指令 LOOP指令 整数数组求和 拷贝字符串 52计算机科学系汇编课件 1. JMP指令 导致向代码段内的目标地址做无条件转移: JMP 目标标号 当CPU执行JMP指令的时候,目标标号的偏移地址被装入指令 指针中,CPU立即开始在新的地址执行指令。 通常情况下,除非标号被指定为全局标号,JMP指令只能跳转到 当前过程内的标号处。 top: jmp top 无限循环 53计算机科学系汇编课件 2. LOOP指令 重复执行一块语句,ECX被自动用作计数器,每次循环后 减1。 LOOP 目标标号 LOOP指令的执行步骤包含两步:首先ECX减1,接着与0相比较, 如果ECX不等于0则跳转到目的地址指定的标号处;如果ECX等于0 则不发生跳转,这时控制权转移到紧跟在LOOP后面的指令处。 mov ax, 0 mov ecx, 5 L1: inc ax loop L1 54计算机科学系汇编课件 注意在循环开始之前不 要随意将ecx初始化为0 循环目的地址与当前地 址只能在相距-128+1
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 村干部培训班
- 2024中国能建葛洲坝集团春季校园招聘520人笔试参考题库附带答案详解
- 风电项目绿色施工方案
- 绿色使命青春行
- 绿色前行模板
- 绿色能源之源
- 立秋节气营销策略
- 2025年关于货物买卖合同纠纷的法律分析
- 2025商务合同撰写:英语合同语言特点与专业用词
- 乙肝六项具体意义(专业分享)-郑州肝病医院
- 第1章 地理信息系统概述《地理信息系统教程》
- 部编 道法 六下 第5课、应对自然灾害(课件+教案+习题+知识点)【2套实用版】
- Chap-17垄断竞争(经济学原理 中英文双语)
- 新课程标准下的教学规范:5.山东省初中历史课堂教学基本要求
- “二级甲等妇幼保健院”评审汇报材料二级甲等妇幼保健院(最新)
- 单相变压器精品课件
- 烯烃分离装置操作规程
- 停电作业工作票配电填写模板
- 最新EXCEL上机操作练习题1
- 二重积分的概念与性质(课堂PPT)
- 海天注塑机日常点检表
评论
0/150
提交评论