汇编语言7

 

用法1:: jmp short 标号(转到标号处执行指令)

 

这种格式的 jmp 指令实现的是段内短转移,它对IP的修改范围为 -128~127,也就是说,它向前转移时可以最多越过128个字节,向后转移可以最多越过127个字节。

 

段内转移,只修改IP,比如jmp ax
段间转移,同时修改CS和IP,比如jmp 1000:200
短转移,IP取值范围-128-127, 8位
近转移,IP取值范围-32768-32767,16位

 

offset是伪指令,它的功能是取标号的偏移地址

 

代码:
assume cs:code
code segment
db  10 dup(0)
s: mov ax,0ffffh
start: jmp short s
jmp short s1
nop
s1: nop
mov ax,4c00h
int 21h
code ends
end start

 

Debug中:
1467:0000 0000          ADD     [BX+SI],AL
1467:0002 0000          ADD     [BX+SI],AL
1467:0004 0000          ADD     [BX+SI],AL
1467:0006 0000          ADD     [BX+SI],AL
1467:0008 0000          ADD     [BX+SI],AL
1467:000A B8FFFF        MOV     AX,FFFF
1467:000D EBFB          JMP     000A
1467:000F EB01          JMP     0012
1467:0011 90            NOP
1467:0012 90            NOP
1467:0013 B8004C        MOV     AX,4C00
1467:0016 CD21          INT     21
jmp short s 被编译器解释为  JMP 000A,,对应机器码EBFB,
分析: EB对应jmp, FB对应-5, -5表示向上跳5个字节, 取jmp指令结束的地址000F,000F-5=000A

 

jmp short s1被编译器解释为  JMP  0012, 对应机器码EB01,
分析: EB对应jmp, 01对应1, 1表示向下跳1个字节, 取jmp指令结束的地址0011, 0011+1=0012

 

机器码中不包含转移的目的地址,这意味着CPU并不知道转移目的地址, 只需知道相对偏移

 

 

 

1.分析下面程序 这个程序能否正确运行到
mov ax,4c00h
int 21h
吗????

 

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:[si]
 mov cs:[di],ax

 

s0:     jmp short s

 

s1:     mov ax,0
  int 21h
  mov ax,0

 

s2:     jmp short s1
nop
codesg ends
end start

 


在Debug中分析:
1467:0000 B8004C        MOV     AX,4C00
1467:0003 CD21          INT     21
1467:0005 B80000        MOV     AX,0000
1467:0008 90            NOP
1467:0009 90            NOP
1467:000A BF0800        MOV     DI,0008
1467:000D BE2000        MOV     SI,0020
1467:0010 2E            CS:
1467:0011 8B04          MOV     AX,[SI]
1467:0013 2E            CS:
1467:0014 8905          MOV     [DI],AX  //这里把1467:0020处指令 EBF6复制到1467:0008
1467:0016 EBF0          JMP     0008  //跳转到 1467:0008 执行指令 EBF6, F6等于-10,10的16进制A,000A-A=0000
1467:0018 B80000        MOV     AX,0000
1467:001B CD21          INT     21
1467:001D B80000        MOV     AX,0000
1467:0020 EBF6          JMP     0018
1467:0022 90            NOP

 

分析:1.这里把1467:0020处指令 EBF6复制到1467:0008
      2.跳转到 1467:0008 执行指令 EBF6, F6等于-10,10的16进制A,000A-A=0000, 跳转到0000,执行MOV   AX,4C00, INT     21
   程序正常退出

 

灵活应用:
      如何加一条指令,让程序跳过MOV   AX,4C00,执行 INT     21了
    在mov ax,cs:[si]
  ;mov ah,-7      加上这条指令就ok了
     mov cs:[di],ax

 

你可能感兴趣的:(汇编语言)