king嗜血法师 发表于 2011-6-21 03:34:08

实验8的问题

本帖最后由 king嗜血法师 于 2011-6-22 04:02 编辑

assume cs:codesg
codesg segment
         mov ax,4c00H
         int 21H
         
start : mov ax,0
   s : nop
         nop
         
         mov di,offset s
         mov si,offset s2
         mov ax,cs:
         mov cs:,ax
         
    s0 : jmp short s
      
    s1 : mov ax,0
         int 21H
         mov ax,0
         
    s2 : jmp short s1
         nop
      
codesg ends
end start
这个代码段是把s2:中的jmp short s1复制到s:中,按照思路这条指令是IP+(-10),所以执行s:jmp short s1这条指令
ip+(-10)就跳到上面的mov ax,4c00H。但是到了检测点11.3又让我迷惑了。


             mov ax,0f00H
             mov ds,ax

             mov bx,0
             mov dx,0
             mov cx,32

       s:   mov al,
             cmp al,32
             jb s0
             cmp al,128
             ja s0
             inc dx

      s0:inc bx
             loop s
按照第一个代码段的思路jb跳到s0"当前"IP=ip+(x)为偏移地址,那么ja也应该跳到“当前”ip=ip+(x)的偏移地址才对啊,为什么ja也会也会跳到s0?



winddyj 发表于 2011-6-21 12:38:11

第一个例子你还是没能明白
首先要记住一点,跳转的是 IP+当前IP到目标的偏移值

说下第一个题
   s1 : mov ax,0
         int 21H
         mov ax,0
         
    s2 : jmp short s1
s2这条指令,在编译时,就已经把s2至s1的偏移算出来了,比如是-10,那在程序里,它表示为jmp -10
那当s2这条指令被复制到s处时,它的指令还是jmp -10,所以才能执行到mov ax,4c00H处

再看第二题
比如jb s0这条指令到s0的距离为10,ja s0这条指令到s0的距离为6
那它们的偏移值分别就是10和6,再加上它们各自的IP,所以都能跳到s0

king嗜血法师 发表于 2011-6-22 03:12:07

谢谢,弄明白了。
页: [1]
查看完整版本: 实验8的问题