标签:code jmp mov 地址 指令 ax 原理 转移
转移指令的原理
1.0 操作符offset
-
操作我offset在汇编语言中是由编译器处理的符号,伪指令,它的功能是取得标号的偏移地址
-
将start的代码复制到s0中去
-
assume cs:code code segment start: mov ax, bx ;这里占两个字节 mov si, offset start ;将start的偏移地址送入si中 0000H mov di, offset s0 ;将s0的偏移地址送入di中 mov ax, cs:[si] ;通过物理地址将数据送入ax,在通过ax送到di中 mov cs:[di], ax s0: nop ;nop 占一个字节 nop mov ax, 4c00H int 21H code ends end start
1.1 Jmp指令
-
jmp为无条件跳转指令,只可以修改ip
-
jmp指令需要给出两种信息
- 转移的地址
- 转移的距离(段内转移,段内短转移,段内近转移)
-
assume cs:code code segment start: mov ax, 0 jmp short s add ax, 1 s: inc ax mov ax, 4c00H int 21H code ends end start
-
jmp short 标号(转移到标号处执行命令)
-
这种jmp格式指令实现的是段内短转移,它对ip的修改范围为-128~127,也就是说,它向前可以越过128个字节,向后的话最多可以越过127个字节
-
assume cs:code code segment start: mov ax, 0 jmp short ptr s db 256 dup(0) ;这里定义256个空字节 short是跳不过去的,编译不会通过,可以改成near ptr, far ptr s: inc ax mov ax, 4c00H int 21H code ends end start
-
汇编与机器码的对照
-
可以看到在汇编指令中出现的idata,不论它是一个数据还是偏移地址,它都会在对应的机器指令中出现,因为它是cpu执行的机器指令,他必须要处理的数据或地址,下图是上面程序对应的机器代码
-
CPU是如何进行转移的尼?
-
通过以上可以CPU 不需要目的地址也可以实现对地址的修改
-
ip指向03H 将指令读取到指令缓存区,ip自增2变成05H,执行执行后 ,EB是jmp的机器码 ,向后在跳3个字节,ip等于08H,这个时候执行inc ax将ax自增1
-
jmp short 标号的功能是(ip)= (ip)+8位偏移 8位位移是由程序在编译的时候算出的
-
jmp near ptr 标号说明,段内近转移 16位位移
-
16位位移的范围是-32768~32767
1.2 转移指令的目的地址
-
之前的jmp,其机器码中并没有转移的目的地址,而是相对于当前ip的转移偏移
-
jmp far ptr 标号 实现的段间转移,又称段转移
-
far ptr 指明了指令中标号的段地址和偏移地址改变了CS:IP
-
assume cs:code code segment start: mov ax, 0 jmp far ptr s db 256 dup(0) s: inc ax mov ax, 4c00H int 21H code ends end start
-
jmp far ptr可以看出机器码是包含要跳转的地址,没有相对于当前ip的计算转移偏移
1.3 jmp 寄存器
- 相当于 jmp near ptr 标号
1.4 转移地址在内存中的jmp
-
jmp word ptr 内存单元地址
-
功能:内存单元存储的一个字就是转移的目的地的偏移地址
-
因为word是16位的只能完成段内转移,进行16位位移
-
代码示例
-
mov ax, 1234H mov ds:[0], ax jmp word ptr ds:[o] ;这里跳转的为CS:1234H
-
jmp dword ptr 内存单元地址(段间转移)
-
功能:从内存单元地址存放2个字,高地址对应段地址,低地址对应偏移地址 因为dword是32位的可以完成段间转移
-
CS=内存单元地址+2
-
IP= 内存单元地址
-
代码示例
-
mov ax, 1234H mov ds:[0], ax mov ds:[2], 0 jmp word ptr ds:[0] ;这里跳转的为CS:IP = 0000:1234H
1.5 jcxz 指令 jmp cx is zero
- jcxz 如果cx为0则跳转
- 是一个有条件的跳转指令,所有的有条件转移指令都是短转移,对应的机器码包含转移的位移,而不是目的地址,对IP的修改都是-128~127
1.6 loop指令
-
loop为循环指令,所有循环都是短转移,对应的机器码是转移的位移,而不是物理地址
-
cx为0 则向下执行
-
在内存2000H段中查找第一个值为0的字节,找到后将偏移地址放入dx中
-
assume cs:code code segment start: mov ax, 2000H mov ds, ax mov bx, 0 s: mov cl, [bx] mov ch, 0 jcxz ok inc bx ;自增1 去找下一个内存单元的数据 loop s ok: mov dx, bx mov ax, 4c00H int 21H code ends end start
1.7 根据位移进行转移的意义
- 前面讲到:
- jmp short 标号
- jmp near ptr 标号
- jcxz 标号
- loop 标号
- 几种指令,他们对ip的修改都是根据转移目的地址和起始地址之前的位移进行的,他们对应的机器码不包含转移目的地的地址,而是包含到目的地的位移距离
- 这样的设计,方便了程序段在内存中的浮动装配
- 如果这些指令码中是包含物理地址,则就对程序段在内存中的偏移地址有了严格的限制
1.8 编程题
- 学蒙蔽 先停停
标签:code,jmp,mov,地址,指令,ax,原理,转移 来源: https://www.cnblogs.com/immortal-mode/p/14106188.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。