转移指令的原理(学习汇编)

1.可以修改IP,或同时修改CS和IP的指令统称转移指令。有两种类型转移:

(1)只修改IP是段内转移,如:jmp ax

(2)修改CS和IP是段间转移,如:jmp 1000:0

2.操作符offset是一个伪指令,它的功能是取得标号的偏移地址。

3.jmp为无条件转移,可以只修改IP,也可以同时修改CS和IP的值,jmp指令要给出两个信息:

(1)转移的目的地址。

(2)转移的距离(段间转移,段内转移的短转移和近转移)

4.jmp short 标号(转到标号处执行)

这种指令实现的是段内短转移。jmp指令中的"标号"是代码段中的标号,指明了指令要转移的目的地,

转移指令结束,CS:IP指向标号处的指令。

5.CPU在执行jmp指令时并不需要指明转移的目标地址。

6.在“jmp short 标号“指令所对应的机器码中,并不包含转移的目的地址,而包含的是转移的位移。

7."jmp short 标号" 的功能是:(IP)=(IP)+8位位移

(1)8位位移=标号处的地址-jmp指令后的第一个字节的地址。

(2)short 指明此处的位移是8位

(3)8位位移的的范围为-128~127,用补码表示。

(4)8位位移由编译程序编译时算出。

8.jmp near ptr 标号表示段内近转移。

9."jmp near ptr 标号"的功能是:(IP)=(IP)+16位位移

(1)16位位移=标号处的地址-jmp指令后的第一个字节的地址。

(2)near ptr 指明此处的位移是16位,进行段内近转移。

(3)16位位移范围是-32768~32767,用补码表示。

(4)16位位移由编译程序在编译时算出。

10."jmp far ptr 标号"实现的是段间转移,又称远转移。功能如下:

(CS)=标号所在段的段地址;(IP)=标号所在段的偏移地址。

far ptr 指明了指令用标号的段地址和偏移地址修改CS和IP。

11.转移地址在内存中的jmp指令有以下几种:

(1)jmp word ptr 内存单元地址(段内转移)16位

功能:从内存单元地址开始处存放着一个字,是转移的目的的偏移地址。

内存单元地址可以用寻址方式的任意格式给出。

比如,下列指令:

mov ax,0013h
      mov ds:[0],ax
      jmp word ptr ds:[0]

(2)jmp dword ptr 内存单元地址(段间转移)

功能:从内存单元地址开始处放着两个字,高地址处放着转移的目的段地址,

低地址处放着转移的目的地址的偏移地址。

(CS)=(内存单元地址+2)

(IP)=(内存单元地址)

内存单元地址可以用寻址方式的任意格式给出。

比如,下列指令:

mov ax,0123h
      mov ds:[0],ax
      mov word ptr ds:[2],0
      jmp dword ptr ds:[0]

执行后,(CS)=0,(IP)=0123H,CS:IP指向0000:0123

12.jcxz指令为有条件转移,所有有条件转移指令都是短转移。

指令格式:jcxz 标号(如果(cx)=0,转移到标号出执行)

当cx<>0时,什么也不做(程序下下执行)

13.loop指令是循环指令,所有的循环指令都是短转移。

指令格式:loop 标号((cx)=(cs)-1,如果(cx)<>0,转移到标号出执行)

当cx=0时,什么也不做(程序下下执行)

14.根据位移进行转移是为了方便程序段在内存中的浮动装配

15.根据位移进行转移的指令,它们的转移范围受到转移位移的限制,如果在源程序中出现了转移范围超界的问题,在编译的时候编译器将报错。

转移指令的原理(学习汇编),布布扣,bubuko.com

时间: 2024-12-25 18:19:10

转移指令的原理(学习汇编)的相关文章

汇编转移指令的原理

1.操作符offset 操作符offset在汇编语言中是由编译器处理的符号,他的功能是取得标号的偏移地址 比如下面程序: assume cs:codesg codesg segment start:mov ax,offset start 相当于mov ax,0 s:mov ax,offset s 相当于mov ax,3 codesg ends end start 在上面的程序中,offset操作符取得了标号start和s的偏移地址0和3,所以指令mov ax,offset start相当于指令m

int指令(学习汇编)

int指令 格式:int n n为中断类型码,它的功能是引发中断过程. CPU执行int n指令,相当于引发一个n号中断的中断过程,执行过程如下: 1)取中断类型码n: 2)标志寄存器入栈,IF=0,TF=0: 3)CS.IP入栈 4)(IP)=(n*4),(CS)=(n*4+2) 从此处转去执行n号中断的中断处理程序. 可以在程序中使用int指令调用任何一个中断的中断处理程序. assume cs:code code segment start:    mov ax,0b800h move s

答复学习汇编不顺利的准大学生

[来信] 老师.我是一名准软件工程大学生..我高2时学了C语言(皮毛),还有Java一部分,由于这样,高中成绩差,高3几乎没接触,暑假,我就网购一本汇编语言(我想学软件破解),看了3/4有人说就可以了我就开始学,发现教程根本就授人以鱼.失望了,就买了本c++ primer plus看了8章,然而学校开学开始学的是C语言,听说汇编语言对编程很有帮助,我就又想重学汇编,想到我校不需要学汇编,很矛盾.不知道怎么办 [回复] 很高兴能看到你有机会学习你感兴趣的专业.在你即将踏入大学校园之际,我想告诉你,

Android自复制传播APP原理学习(翻译)

 Android自复制传播APP原理学习(翻译) 1 背景介绍 论文链接:http://arxiv.org/abs/1511.00444 项目地址:https://github.com/Tribler/self-compile-Android 吃完晚饭偶然看到这篇论文,当时就被吸引了,马上翻译总结了一下.如有错误欢迎斧正. 该论文的研究出发点比较高大上这里我们就不多说了,简而言之就是想通过移动设备来实现一个自组网,在发生灾难的时候,手机之间能够自动传输关键数据,减少损失.整个目标通过设计一个能够

编译原理学习导论

编译原理学习导论 大学课程为什么要开设编译原理呢?这门课程关注的是编译器方面的产生原理和技术问题,似乎和计算机的基础领域不沾边,但是编译原理却一直作为大学本科的必修课程,同一时候也成为了研究生入学考试的必考内容.编译原理及技术从本质上来讲就是一个算法问题而已,当然因为这个问题十分复杂,其解决算法也相对复杂.我们学的数据结构与算法分析也是讲算法的,只是讲的基础算法,换句话说讲的是算法导论,而编译原理这门课程讲的就是比較专注解决一种的算法了.在20世纪50年代,编译器的编写一直被觉得是十分困难的事情

直接定址表(学习汇编)

1.我们可以使用一种标号,这种标号不但表示内存单元的地址,还表示了内存单元的长度,即表示在此标号处的单元,是一个字节单元,还是字单元,还是双字单元.如 a:db 1,2,3,4,5,6,7,8             改写为    a   db   1,2,3,4,5,6,7,8 b:dw  0                        改变为    b     dw   0 使用不带“:”的标号,它们是同时描述内存地址和单元长度的标号.这种标号包含了对单元长度的描述,所以,在指令中,它可以

使用BIOS进行键盘输入和磁盘读写(学习汇编)

1.键盘输入将引发9号中断,BIOS提供了int 9中断例程.CPU在9号中断发生后,执行int 9中断例程,从60h端口读出扫描码,并将其转化为相应的ASCII码或状态信息,存储在内存的指定空间(键盘缓冲区或状态字节)中.一般的键盘输入,在CPU执行完int 9中断例程后,都放到了键盘缓冲区中.键盘缓冲区有16个字单元,可以存储15个按键的扫描码和对应的ASCII码. 2.下面,我们通过下面几个键: A.B.C.D.E.shift_A.A 的输入过程,简要地看一下int 9中断例程对键盘输入的

更灵活的定位内存地址的方法(学习汇编)

1.and指令:逻辑与指令,按位进行与运算.与1不变,与0变0,可将对象相应位设为0. 2.or指令:逻辑或指令,按为进行或运算.或1变1,或0变0,可将对象位设为1. 3.[BX+idata]的几种表现形式: mov ax,[200+bx] mov ax,200[bx] mov ax,[bx].200 4.SI和DI是8086CPU中和Bx功能相似的寄存器,只是不能分成两个8位的寄存器来用. 5.[BX+SI]进行内存地址定位的几种形式: mov ax,[bx][si] mov ax,[bx+

端口(学习汇编)

1.在访问端口的时候,CPU通过端口地址来定位端口.因为端口所在的芯片和CPU通过总线相连,所以,端口地址和内存地址一样,通过地址总线来传送. 2.在PC系统中,CPU最多可以定位64KB个不同的端口,则端口地址的范围为0~65535 3.对端口的读写不能用mov,push.pop等内存读写指令.端口的读写指令只有两条:in和out,分别用于从端口读写数据和往端口写入数据. 4.在in和out指令中,只能使用ax或al来存放从端口中读入的数据或要发送到端口中的数据. 5.访问8位端口时用al,访