|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 shuiyu 于 2017-8-14 11:45 编辑
越努力,越幸运。欢迎大家来看我的笔记 小白刚学,不对的请各位大佬指正,谢谢
一、jmp far ptr 标号(段间转移,又称为远转移)
(1)指令 “jmp far ptr 标号” 功能如下:
(CS)=标号所在段的段地址;
(IP)=标号所在段中的偏移地址。
far ptr指明了指令用标号的段地址和偏移地址修改CS和IP。
(2)机器码中:EA表示远转移
(3) jmp word ptr 内存单元地址(段内转移,只改变IP)
功能:从内存单元地址处开始存放着一个字,是转移的目的偏移地址。
其实就是不改变CS,只改变IP。和JMP AX一样
(4) jmp dword ptr 内存单元地址(段间转移,改变CS和IP)
功能:从内存单元地址处开始存放着两个字,高地址处的字是转移的目的段地址,低地址处是转移的目的偏移地址。
(CS)=(内存单元地址+2)
(IP)=(内存单元地址)
检测点9.1
(1)若要使jmp指令执行后,CS:IP指向程序的第一条指令,在data段中应该定义哪些数据?程序如下。
assume cs:code
data segment
答案①db 3 dup (0)
答案②dw 2 dup (0)
答案③dd 0
data ends
code segment
start: mov ax,dtat
mov ds,ax
mov bx,0
jmp word ptr [bx+1]
code ends
end start
解: 因为jmp word ptr [bx+1]是字型的数据占两个字节,且取内存单元的值为[BX+1];则我们应该把[bx+1]和[bx+2]内存单元的数据赋值为零。故有上面三种答案。
(2)补全程序,使用jmp指令执行后,CS:IP指向程序的第一条指令。程序如下。
assume cs:code
data segment
dd 12345678h
data ends
code segment
start: mov ax,data
mov ds,ax
mov bx,0
mov [bx], bx
mov [bx+2],cs
jmp dword ptr ds:[0]
code ends
end start
解:这题我们只要记住:jmp dword ptr ds:[0]为双字型数据占4个字节,且高地址处的字是转移的目的段地址,低地址处是转移的目的偏移地址。(CS)=(内存单元地址+2)(IP)=(内存单元地址)。所以把[bx+2]赋值为CS,使jmp指向CS段,把[bx]赋值为零,使IP指向零也就是程序的第一条指令。
(3)用Debug查看内存,结果如下:(因为我的2000:1000处被占用了,所以改为2000:1050;对结果不会有影响的)
2000:1000 BE 00 06 00 00 00 ......
则此时,CPU执行指令:
mov ax,2000h
mov es,ax
jmp dword ptr es:[1000h]
理论上答案应该为:(cs)= 0006H ,(ip)= 00BEH
因为高位存放段地址(后2个字节为高位),低位存放偏移地址(前2个字节为低位)
(cs)=(内存单元地址+2),(ip)=(内存单元地址)
但是我用自己用DEBUG单步实现,发现CS没有发生变化,只有IP变成00BE了。见下图:
这是还没有开始运行前的:CS为000AH,IP为0000H
程序执行了以后,CS还是000AH,IP正常变化为00BEH。
原因我看答案说的是:
jmp dword ptr es:[1000H]对应的debug下的指令并不是你给出的
jmp dword ptr 2000:[1000H]这样的形式,可以看出,当你写出上述指令后,运行的时候其指令仅仅变成了jmp 1000,缺少了一个指定段地址的指令。
也就是说在debug模式下,debug根本就不认识jmp dword ptr 2000:[1000H]这样的形式。
谢谢小甲鱼带来的视频教程,感谢!!
本节结束,多谢览阅!
越努力,越幸运。谢谢大家来看我的笔记 小白刚学,不对的请各位大佬指教,谢谢 |
评分
-
查看全部评分
|