cpu执行指令步骤:
1. 从cs和ip所组合出来的地址读取指令,将指令存放到指令缓存器中
2. 改变ip寄存器,ip = ip+所读指令的字节数
3.执行指令缓存器中的内容,跳转到第1步
assume cs:code, ds:data
data segment
db 128 dup (0)
data ends
stack segment
db 128 dup (0)
stack ends
code segment
start:mov ax,data
mov ds,ax
mov ax,stack
mov ss, ax
s: mov ax, 1000H
mov bx,2000H
jmp s
; 标号地址 = jmp指令后的第一个字节地址 + 指令长度
mov ax,4C00H
int 21H
code ends
end start
0012是jmp指令后第一个字节的地址, F8是跳转的指令长度
12H + F8H = AH(1个字节内的加法) 12H +(-8H) = AH
-8的补码就是F8
jmp跳转分为分为 1. 8位位移(范围: -128 ~ 127) 2. 16位位移(范围:-32768 ~ 32767)
所以,jmp 机器码中并没有包含转移的目的地址,jmp是通过位移(字节长度)实现跳转
assume cs:code, ds:data
data segment
db 128 dup (0)
data ends
stack segment
db 128 dup (0)
stack ends
code segment
start:mov ax,data
mov ds,ax
mov ax,stack
mov ss, ax
s: mov ax, 1000H
mov bx,2000H
db 130 dup (0)
;jmp short s ; short指定使用8位位移
jmp near ptr s ; near ptr 指定使用16位移
; 标号地址 = jmp指令后的第一个字节地址 + 指令长度
mov ax,4C00H
int 21H
code ends
end start