




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1,OFFSET 操作符 PTR 操作符 TYPE 操作符 LENGTHOF 操作符 SIZEOF 操作符,(三)和数据相关的操作符和伪指令,2,返回数据标号的偏移地址(标号距数据段开始的距离,以字节为单位)。 保护模式下偏移总是32位的。 实模式下偏移只有16位。,(三)和数据相关的操作符和伪指令 1. OFFSET操作符,3,例:假设bVal位于00303000h处。 .data bVal BYTE ? wVal WORD ? dVal1 DWORD ? dVal2 DWORD ? .code mov esi,OFFSET bVal; ESI = mov esi,OFFSET wVal;
2、ESI = mov esi,OFFSET dVal1; ESI = mov esi,OFFSET dVal2; ESI = mov esi,OFFSET bVal + 1 ,(三)和数据相关的操作符和伪指令 1. OFFSET操作符,00303000 00303001 00303003 00303007,4,用来说明操作数的尺寸/类型 必须和以下标准数据类型联合使用:BYTE,SBYTE,WORD,SWORD,DWORD,SDWORD,FWORD,QWORD,TBYTE,(三)和数据相关的操作符和伪指令 2. PTR操作符,5,(三)和数据相关的操作符和伪指令 2. PTR操作符,.data
3、myDouble DWORD 12345678h .code mov ax, myDouble; ? mov ax, WORD PTR myDouble; ax = ? mov ax, WORD PTR myDouble+2; ax = ? mov bl, BYTE PTR myDouble; bl = ?,错误 5678h 1234h 78h,6,返回按字节计算的变量的单个元素的大小。 例: .data var1 BYTE ? var2 WORD ? var3 DWORD ? var4 QWORD ?,(三)和数据相关的操作符和伪指令 3. TYPE操作符,1,2,4,8,7,计算数组中元素
4、的个数。 例:,(三)和数据相关的操作符和伪指令 4. LENGTHOF操作符,.data byte1 BYTE 10,20,30 array1 WORD 30 DUP(?),0,0 array2 WORD 5 DUP(3 DUP(?) arrar3 DWORD 1,2,3,4 digitStr BYTE 12345678,0,3,30+2,53,4,9,8,SIZEOF返回值LENGTHOF返回值TYPE返回值 例:,(三)和数据相关的操作符和伪指令 5. SIZEOF操作符,.data intArray WORD 32 DUP(0),2 32 64,9,用寄存器作为地址,通过改变寄存器的值
5、来访问内存单元 可以是任何用方括号括起来的32位通用寄存器(EAX,EBX,ECX,EDX,ESI,EDI,EBP、ESP) .data val1 BYTE 10h .code mov esi,OFFSET val1 mov AL,esi mov esi,BL 实地址模式下只能用SI,DI,BX,BP。通常尽量避免使用BP(BP常用来寻址堆栈而不是数据段)。,(四)间接寻址 1. 间接操作数(寄存器间接寻址),.data val1 BYTE 10h .code main proc mov si,OFFSET val1 mov AL,si ;AL=10h,10,(四)间接寻址 1. 间接操作数(
6、寄存器间接寻址),注意声明操作数的类型 inc esi; error: operand must have size inc BYTE PTR esi inc WORD PTR esi inc DWORD PTR esi ,11,汇编语言中如何寻址数组元素? 完全使用直接寻址 不切实际 解决办法:用寄存器作为指针,通过改变指针寄存器的值来访问数组中的不同元素,存放地址的寄存器称为间接操作数。,(四)间接寻址 1. 间接操作数(寄存器间接寻址),12,例:三个双字相加 .data arrayD DWORD 10000h,20000h,30000h .code mov esi,OFFSET arr
7、ayD mov eax,esi add esi,4 add eax,esi add esi,4 add eax,esi,(四)间接寻址 2. 数组,;=10000h,;=30000h,;=60000h,13,例: .data arrayB BYTE 10h,20h,30h .code mov esi,0 mov al,arrayB + esi; ? mov al,arrayBesi; ? mov esi,OFFSET arrayB mov al,esi; ? mov al,esi+1; ? mov al,esi+2; ? Array 定义为 word?,(四)间接寻址 3. 变址操作数(寄存器
8、相对寻址),AL = 10h 同上,另一种格式 AL = 10h AL = 20h AL = 30h,14,控制转移或分支是一种改变程序执行顺序的方法。 控制转移可分为两种: 无条件转移:以JMP指令为例 条件转移:以LOOP指令为例,(五)JMP和LOOP指令,15,例:创建一个循环 top: . . . jmp top; 死循环,(五)JMP和LOOP指令 1. JMP指令,16,格式:LOOP 目的地址/标号 执行过程: 在实地址模式下,用做默认循环计数器的是CX而不是ECX。 在任何模式下,LOOPD指令都使用ECX作为循环计数器;LOOPW都使用CX作为循环计数器。,(五)JMP和L
9、OOP指令 2. LOOP指令,17,例: mov ax,0 mov ecx,5 L1: inc ax loop L1 循环结束时,AX? ECX?,(五)JMP和LOOP指令 2. LOOP指令,5,0,18,循环的目的地址与当前地址只能在相距-128到+127字节的范围之内。机器指令平均3字节左右,因此一个循环平均最多只能包含大约42条指令。 循环的嵌套,(五)JMP和LOOP指令 2. LOOP指令,19,数组元素的求和 (SumArray.asm) ; This program sums an array of words. INCLUDE Irvine32.inc .data int
10、array WORD 100h,200h,300h,400h .code main PROC mov edi,OFFSET intarray; address of intarray mov ecx,LENGTHOF intarray; loop counter mov ax,0; zero the accumulator L1: add ax,edi; add an integer add edi,TYPE intarray ; point to next integer loop L1; repeat until ECX = 0 INVOKE ExitProcess,0 main ENDP
11、 END main,(五)JMP和LOOP指令 3. 例子:整数数组求和,20,TITLE Copying a String (CopyStr.asm) ; This program copies a string. INCLUDE Irvine32.inc .data source BYTE This is the source string,0 target BYTE SIZEOF source DUP(0),0 .code main PROC mov esi,0; index register mov ecx,SIZEOF source; loop counter L1: mov al,
12、sourceesi; get a character from source mov targetesi,al; store it in the target inc esi; move to next character loop L1; repeat for entire string INVOKE ExitProcess,0 main ENDP END main,(五)JMP和LOOP指令 4. 例子:拷贝字符串,21,操作数类型小结,直接操作数(直接寻址) mov al,var1 mov al,1000h 直接偏移操作数在变量的名字上加一个偏移量。 mov al,var1+2 mov
13、al, var1+2 间接操作数(寄存器间接寻址)用方括号括起的保护数据地址的寄存器。 mov esi,BL 变址操作数(寄存器相对寻址)把常量和间接操作数结合在一起。 mov al,arrayBesi mov al,esi+2,微机原理及接口技术 第3章 Intel处理器指令系统及汇编语言,四、堆 栈、过 程,23,本节要点,外部库链接 静态/动态库 堆栈 过程,随着程序规模的增长,需要对其进行适当的划分,24,链接库:已经编译好的子程序库 过程(子程序) 用户怎样使用?假设程序要调用名为WriteString的过程在控制台上显示字符串 WriteString 是一个已经编译好的子程序,(一
14、)与外部库链接 背景知识,目标文件,库,25,用户使用步骤 程序开始部分用 PROTO 声明子程序 WriteString PROTO 程序中用 CALL 指令调用 call WriteString 当程序被编译时,编译器为 CALL 指令的目标地址留出空白,该空白将由链接器填充。 链接器在链接库中查找WriteString这个名字,从库中把合适的机器指令拷贝到程序的可执行文件中,并把WriteString的地址插入到CALL指令中。,(一)与外部库链接 背景知识,26,链接器的命令行选项 Link32 /subsystem:windows HelloWin.obj user32.lib ke
15、rnel32.lib,(一)与外部库链接 背景知识,kernel32.lib 只是API函数的链接信息 kernel32.dll 包含实际的执行代码,27,32位的压栈(PUSH)操作 如PUSH 0A5H 堆栈指针ESP减4, ESPESP4 将进栈数据拷贝到堆栈指针所指向的位置。SS:ESPsrc push r/m16 push r/m32 push imm32,(二)堆栈操作 1. 堆栈: 压栈操作/推入堆栈,28,出栈(POP)操作 POP ECX 从当前栈顶(ESP指向的位置)读取数据并赋值给ECX ecxSS:ESP 堆栈指针ESP增加4 ESPESP4 pop r/m16 pop
16、 r/m32,(二)堆栈操作 1. 堆栈: 出栈操作/弹出堆栈,ecx00000002,29,临时借用寄存器 把寄存器推入堆栈 使用寄存器 从堆栈中恢复寄存器原值 CALL指令执行时,CPU用堆栈保存当前过程的返回地址。 调用过程时,可通过堆栈传递参数。,(二)堆栈操作 1. 堆栈: 堆栈的用途,30,注意事项: 保护模式下的立即数总是32位的 在实地址模式下,默认的立即数是16位的,除非使用.386(或更高)处理器伪指令 32位程序: PUSHFD 指令在堆栈上压入32位的EFLAGS寄存器的值。 POPFD 指令将堆栈顶部的值弹出并送至EFLAGS寄存器。 实地址模式程序: PUSHF 指
17、令在堆栈上压入16位的FLAGS寄存器的值。 POPF 指令从堆栈顶部弹出16位的值并送到FLAGS寄存器。,31,举例:将标志保存在变量中。 .data saveFlags DWORD ? .code pushfd ; 标志入栈 pop saveFlags ; 拷贝到变量里面 push saveFlags ; 将保存的标志入栈 popfd ; 恢复标志 ,32,PUSHAD 指令在堆栈上按下列顺序压入所有32位通用寄存器:EAX、ECX、EDX、EBX、ESP,EBP、ESI、EDI。 POPAD 指令以相反的顺序从堆栈中弹出这些通用寄存器。 PUSHA和POPA 仅用于80286处理器:
18、PUSHA 指令:以同样的顺序压入所有的16位寄存器(AX、CX、DX、BX、SP,BP、SI、DI)。 POPA 指令:以相反的顺序从堆栈中弹出这些通用寄存器。,PUSHAD,PUSHA,POPAD 和 POPA 指令,33,如果在过程中修改了很多寄存器,则可以考虑使用PUSHAD 和 POPAD 指令保存和恢复寄存器的值。 MySub PROC pushad; 保存通用寄存器的值 . . mov eax,. mov edx,. mov ecx,. . . popad; 恢复通用寄存器的值 ret MySub ENDP,2. PUSH 和 POP 指令 PUSHAD,PUSHA,POPAD 和 POPA 指令,34,TITLE Program Template
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 【正版授权】 IEC 60436:2025 EN-FR Electric dishwashers for household use - Methods for measuring the performance
- 【正版授权】 IEC 60721-3-6:2025 EN Classification of environmental conditions - Part 3-6: Classification of groups of environmental parameters and their severities - Ship environments
- 健康行业课件制作
- 华师大版信息技术课件
- 邯郸抽考数学试卷
- 河西一模高三数学试卷
- 衡水中学6月数学试卷
- 中国彩条布行业市场发展前景及发展趋势与投资战略研究报告(2024-2030)-20241228-144503
- 中国自卸式垃圾车行业投资分析及发展战略研究咨询报告
- 2018-2024年中国森林防火培训中心未来趋势预测分析及投资规划研究建议报告
- 2025年初中劳动教师招聘考试试卷(附答案) 三套
- 经营管理台账管理办法
- 2025年云南省高考政治试卷(含答案解析)
- 银行电信诈骗培训课件
- 食品安全工作领导小组及职责
- 烧结工艺培训课件
- 2025年4月自考00841第二外语(法语)试题
- 水表安装培训课件下载
- 国有企业招标培训课件
- 2025年全国工会系统经审业务技能大赛知识总题库(1800题)-下部分
- 绿证交易协议
评论
0/150
提交评论