汇编基础-实例分析
2017-12-15 18:00
204 查看
一、[BX]和loop指令
直接来解释下这两个指令吧!我们知道[0]可以表示偏移量为0的内存单元(段地址存在CS里),[BX}则提供了更为灵活的方式,即mov ax, [bx]的功能是寄存器bx中存放的数据作为一个便宜地址EA,段地址SA默认在ds中,将SA:EA处的数据送入ax中,即(ax)=((ds)*16+(bx)),()表示寄存器中的值。实际上,[]就表示一个内存单元,其中的数值或寄存器则表示了偏移量的来源。
loop指令是循环指令,格式是loop 标号。当CPU执行loop命令时需要执行两步操作:1)(cx) = (cx)-1; 2) 判断cx中的值,不为零时则转至标号处执行循环体语句。比如程序:
assume cs:code
code segment
mov ax, 2
mov cx, 11
s: add ax, ax
loop s
mov ax, 4c00h
int 21h
code ends
end
二、and与or指令
and指令即逻辑按位与操作,利用此操作可以将操作对象的相应位设为0,其他位不变:
mov al, 01100011B
and al, 00111011B
al = 00100011B //执行后
or指令即逻辑按位或操作,利用此操作可以将操作对象的相应位设为1,其他位不变:
mov al, 01100011B
or al, 00111011B
al = 01111011B
除了[A-D]X的四个通用寄存器之外,还有与bx功能相近的两个寄存器:si与di,si与di不能够分成两个8位寄存器来使用,其余功能类似,比如:
mov bx, 0
mov ax, [bx]
mov si, 0
mov ax, [si]
下面的语句功能也是一样的:
mov bx, 0
mov ax, [bx+123]
mov si, 0
mov ax, [si+123]
mov di, 0
mov ax, [di+123]
mov di, 0
mov ax, [di]
三、转移指令
可以修改IP,或同时修改CS和IP的指令统称为转移指令。8086CPU的转移行为有两类:
-1. 只修改IP,称为段内转移,如:jmp ax;
-2. 同时修改CS和IP,称为段外转移,如:jmp 1000:0;
至于call和ret指令,其实也是转移指令,从执行效果上看:
-1. CPU执行ret指令时,相当于进行:pop IP;
-2. CPU执行retf指令时,相当于进行:pop IP; pop CS;
当CPU执行call指令时,进行两步操作:
-1* 将当前的IP或CS和IP一起压入栈中;
-2* 转移
直接来解释下这两个指令吧!我们知道[0]可以表示偏移量为0的内存单元(段地址存在CS里),[BX}则提供了更为灵活的方式,即mov ax, [bx]的功能是寄存器bx中存放的数据作为一个便宜地址EA,段地址SA默认在ds中,将SA:EA处的数据送入ax中,即(ax)=((ds)*16+(bx)),()表示寄存器中的值。实际上,[]就表示一个内存单元,其中的数值或寄存器则表示了偏移量的来源。
loop指令是循环指令,格式是loop 标号。当CPU执行loop命令时需要执行两步操作:1)(cx) = (cx)-1; 2) 判断cx中的值,不为零时则转至标号处执行循环体语句。比如程序:
assume cs:code
code segment
mov ax, 2
mov cx, 11
s: add ax, ax
loop s
mov ax, 4c00h
int 21h
code ends
end
二、and与or指令
and指令即逻辑按位与操作,利用此操作可以将操作对象的相应位设为0,其他位不变:
mov al, 01100011B
and al, 00111011B
al = 00100011B //执行后
or指令即逻辑按位或操作,利用此操作可以将操作对象的相应位设为1,其他位不变:
mov al, 01100011B
or al, 00111011B
al = 01111011B
除了[A-D]X的四个通用寄存器之外,还有与bx功能相近的两个寄存器:si与di,si与di不能够分成两个8位寄存器来使用,其余功能类似,比如:
mov bx, 0
mov ax, [bx]
mov si, 0
mov ax, [si]
下面的语句功能也是一样的:
mov bx, 0
mov ax, [bx+123]
mov si, 0
mov ax, [si+123]
mov di, 0
mov ax, [di+123]
mov di, 0
mov ax, [di]
三、转移指令
可以修改IP,或同时修改CS和IP的指令统称为转移指令。8086CPU的转移行为有两类:
-1. 只修改IP,称为段内转移,如:jmp ax;
-2. 同时修改CS和IP,称为段外转移,如:jmp 1000:0;
至于call和ret指令,其实也是转移指令,从执行效果上看:
-1. CPU执行ret指令时,相当于进行:pop IP;
-2. CPU执行retf指令时,相当于进行:pop IP; pop CS;
当CPU执行call指令时,进行两步操作:
-1* 将当前的IP或CS和IP一起压入栈中;
-2* 转移
相关文章推荐
- jQuery基础的工厂函数以及定时器的经典实例分析
- 结合实例分析arm指令集中的adds指令与arm内嵌汇编
- C#验证码识别基础方法实例分析
- 汇编--基础分析:数据段在内存中的存放及空间
- 实例分析: 如何对比JIT优化前后的汇编代码
- Andriod编程基础(二):第一个Andriod实例及代码分析
- IOS 基础媒体文件格式语法描述和语意(MP4文件格式分析实例)
- 基础:JSP和IIS的最佳解决方案实例分析
- 每天进步一点点------时序分析基础与时钟约束实例(四)IO口时序(Input Delay /output Delay)
- socket编程基础4(实例分析)
- 汇编--基础分析:数据段在内存中的存放及空间
- JVM基础:生产环境参数实例及分析
- gcc编程环境基础4--ld命令和u-boot中的lds文件实例和简单实例分析
- gcc编程环境基础4--ld命令和u-boot中的lds文件实例和简单实例分析
- 关于java多线程编程的基础代码分析实例
- puppet自动化技术基础分析及实例部署详解
- 实例分析: 如何对比JIT优化前后的汇编代码
- Python3基础之输入和输出实例分析
- JavaBean 基础概念、使用实例及代码分析
- 每天进步一点点------时序分析基础与时钟约束实例(一)