《零基础入门学习汇编语言》第四十四讲及检测点9.1
本帖最后由 shuiyu 于 2017-8-14 11:45 编辑越努力,越幸运。欢迎大家来看我的笔记{:10_297:} 小白刚学,不对的请各位大佬指正,谢谢{:10_254:}
一、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
code ends
end start
解: 因为jmp word ptr 是字型的数据占两个字节,且取内存单元的值为;则我们应该把和内存单元的数据赋值为零。故有上面三种答案。
(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
mov ,cs
jmp dword ptr ds:
code ends
end start
解:这题我们只要记住:jmp dword ptr ds:为双字型数据占4个字节,且高地址处的字是转移的目的段地址,低地址处是转移的目的偏移地址。(CS)=(内存单元地址+2)(IP)=(内存单元地址)。所以把赋值为CS,使jmp指向CS段,把赋值为零,使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:
理论上答案应该为:(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:对应的debug下的指令并不是你给出的
jmp dword ptr 2000:这样的形式,可以看出,当你写出上述指令后,运行的时候其指令仅仅变成了jmp 1000,缺少了一个指定段地址的指令。
也就是说在debug模式下,debug根本就不认识jmp dword ptr 2000:这样的形式。
谢谢小甲鱼带来的视频教程,感谢!! {:10_303:}
本节结束,多谢览阅!
越努力,越幸运。谢谢大家来看我的笔记{:10_297:} 小白刚学,不对的请各位大佬指教,谢谢{:10_254:} assume cs:codesg
codesg segment
start: mov ax,2000h
mov es,ax
mov bx,1000h
mov word ptr es:,es
jmp dword ptr es:
codesg ends
end start
用这个源程序也可以调出CS IP的目的地址和目的偏移地址
CS:IP0006:00BE 感谢,答案很完美{:10_279:}
页:
[1]