主题:问点问题
shujujiegou01
[专家分:1070] 发布于 2006-11-22 14:18:00
第一:JMP指令我还不太明白
主要是不明白段内直接和间接,以及段间直接和间接转移
第二:有条件跳转指令那么多,我实在不明白怎么掌握
回复列表 (共3个回复)
沙发
天空未蓝 [专家分:360] 发布于 2006-11-22 15:41:00
关于JMP的问题
这是一个无条件转移
JMP 指令 要给出两种信息,
转移目的地址
转移的距离
它是用来修改ip的指向
在段内 用short时候可以修改为-128~~127 2的八次方
在段内 用far的时候可以修改二的16次方
在段外的时候就是修改的是cs 与 ip 的值
如果还不是很懂的话,我们继续来看
CPU是如何来执行命令的
(说的很粗糙)根据cs和ip 来确定指令所在的内存位置,然后把指令放到缓冲器里,然后 修改ip的大小 命令执行 然后继续根据 cs和IP所确定的位置来读取命令
(如果加入了jmp后) 当CPU执行了CS和IP所确定的数据位置,本来应该已经修改好了的IP去执行的,但是此时执行的JMP这个命令,JMP直接修改了IP的大小 ,所以就不会按照以前的IP执行了,所以这里有个先后顺序,先自动修改IP的大小,等执行完指令后,在去执行IP,这个时候IP可能变也可能不发生变化
下面 谈谈段内的JMP 转移(谈谈是简谈,呵呵,我也是刚刚了三个星期的小菜)
assume cs:code
code segment
start:mov ax,0 这就是一个错误的跳转因为,对于short他只能在段内的
mov bx,0 上下127进行跳转,这显然是不行的
jump short s 我们只需要把 short变成far就可以了
db 256 dup(0) short-8位
s: add ax,1 far- 16位 数字即是 直接,符号 就是间接
inc ax
code ends
end
段外转移
这里我们跳转后面跟的是一个标号,我们还可以来用内存来进行跳转
如果我们想突然跳到段地址为0520 偏移地址为1314的地方 我们应该怎么办呢
(这就是一个段外的转移)
mov ax,0e314H
mov ds:[0],ax
mov word ptr ds:[2],0
jmp dword ptr ds:[0]
执行这个命令以后 IP=1314H CS=0H 这里我们要注意的就是 IP和cs 都是16位置的寄存器 一个IP和CS可以装两个字节 他们的大小是0000H-FFFFH但是当最左边的数字是A-F的时候,对数字直接操作要在前面假零(~~。。~~`)
这就是段外的转移,我们也可以叫他段外间直接转移 因为它是直接对数字进行操作的
条件转移指令其实都可以看出意思的。
比如,JE,E就是EQUAL等于的英文,JA,A就是ABOVE,JB,B就是BELOW。其实都是英文的缩写。
板凳
shujujiegou01 [专家分:1070] 发布于 2006-11-22 16:00:00
assume cs:code
code segment
start:mov ax,0 这就是一个错误的跳转因为,对于short他只能在段内的
mov bx,0 上下127进行跳转,这显然是不行的
jump short s 我们只需要把 short变成far就可以了
db 256 dup(0) short-8位
s: add ax,1 far- 16位 数字即是 直接,符号 就是间接
inc ax
code ends
end
" 这就是一个错误的跳转因为,对于short他只能在段内的"
哪里看出来他不是在段内了?
3 楼
shujujiegou01 [专家分:1070] 发布于 2006-11-22 16:02:00
执行这个命令以后 IP=1314H CS=0H
CS=0H????
我来回复