当前位置:编程学习 > 汇编语言 >>

汇编语言基本概念(续7)

前面学习了汇编指令中也有一些转移指令,在汇编中,转移就是GOTO,它没有IF,SWITCH等高级语言中的一些特性。汇编中指令的执行是按照CS:IP进行单步执行的。转移指令可以只修改IP,也可以两者同时修改。转移指令分无条件转移如jmp,条件jcxz,循环loop,过程及中断等五种。首先学习一个新的操作符offset,这个是由编译器处理的伪指令,功能是取得标号的偏移地址。如start: mov ax,offset start 相当于mov ax,0

image

image

上图就清楚的显示了offset只是在编译器处理阶段的伪指令,编译之后,这地方完全用真实的偏移值替换了。下面列出几种常见的转移指令:

【1】jmp short 标号 段内短转移,对IP的修改范围是-128~127,对应的机器指令EB偏移。这里的位移是标号处的地址-jmp指令后的第一个字节的地址

image

【2】jmp near ptr 标号 段内近转移。实现的功能是(IP)=(IP)+16位位移。同前面一样。位移范围是-32768 ~32767

【3】jmp far ptr 标号 段间转移,或称之为远转移,这里转移后指令的(cs)就是标号所在的段地址,(ip)就是标号在段中的偏移地址。

 

image

【4】jmp reg 转移地址在寄存器中的jmp指令。

【5】jmp word ptr 内存单元地址(段内转移) 从内存单元地址处开始存放着一个字,是转移的目的偏移地址。如 mov ax,0123h mov ds:[0],ax jmp word ptr ds:[0] => (IP) = 0123H

【6】jmp dword ptr 内存单元地址(段间转移) 从内存单元地址处开始存放着两个字,高地址是段地址,低地址处是偏移地址

image

【7】jcxz 标号 如果(cx)=0,转移到标号执行。是短转移.IP 范围是-128~127,其转移方式怀jmp short 标号相同。相当于if((cx) ==0) jmp short 标号

【8】loop 标号 指令为循环指令,短转移。 (cx)=(cx)-1 ,如果(cx)!=0,则转移

前面这几种汇编指令,以标号作为跳转目的地址的指令,其真正取到的地址都是相对地址,正因为是相对地址,所以程序装在内存的不同位置均可以执行,不必因为编译时候分配的地址而在装载时无法无法运行,也正因为是相对地址,并且这个相对地址是在汇编编译时候进行计算的,因此,实际上如果标号与jmp语句之间间隔过大,就会发生编译错误。

image

image

补充:软件开发 , 其他 ,

上一个:多线程的那点儿事(基础篇)
下一个:汇编语言基本概念(续6)

更多汇编语言疑问解答:
汇编汉字显示中add di ,32什么意思
求助,一段汇编代码
汇编小问题新手神马都不会啊~在线等~感激不尽~!
一道计算机组成原理题, 汇编指令MOV AX,[1010H],对应的机器指令编码为048B1010H,其中AX为寄存器寻址
把这个汇编语言逐句翻译下
求 int 3 这条汇编指令的解释?
Proteus isis的问题(汇编)
51单片机用汇编语句编写 p1.7与一个开关键相连,p1.0--p1.5与六个LED灯相连,当p1.7被按下时p1.0--p1.2
用汇编语言将十进制数转换成二进制数,当被转换数大于65535会有什么结果
请问在自己的电脑上写汇编会有问题吗
怎么用汇编语言编程:在一串字符串中找"%",如果有输出Yes,如果没有输出No?
汇编语言宏定义是什么意思?可不可又用别的指令替换宏定义指令
编写汇编语言将1到5转换为二进制数
汇编语言里内存1000H开始存有20个无符号字节数据,编程计算其平均值
汇编语言的loop指令
asp
php
Delphi
Matlab
JSP
Foxpro
JS
C/C++
C#/ASP.NET
VC++
JAVA
VB
汇编语言
html/css
CGI
XML/UML
wap
网站相关
网页素材
python
如果你遇到编程学习难题:
请访问www.zzzyk.com 试试
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,