回 帖 发 新 帖 刷新版面

主题:问点问题

第一:JMP指令我还不太明白
     主要是不明白段内直接和间接,以及段间直接和间接转移

第二:有条件跳转指令那么多,我实在不明白怎么掌握


回复列表 (共3个回复)

沙发


关于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。其实都是英文的缩写。

板凳

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 楼

执行这个命令以后 IP=1314H   CS=0H 

CS=0H????

我来回复

您尚未登录,请登录后再回复。点此登录或注册