本帖最后由 lies_for_L 于 2018-2-11 15:02 编辑
1. 纯汇编写程序的情况下
一般来说无论长短跳转其后都是固定值DATA SEGMENT
STR1 DB ‘ABCDEFG′NEQU-STR1 ;给N赋值,表示当前指令的地址,-STR1表示当前位置到STR1头部的距离,也就是STR1的长度。
STR2 DB ‘BCDEFG′MEQU-STR2
MESS DB ‘NO MATCH!′RIGHTDB‘MATCH!’
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:DATA
BEGIN:
MOV AX,DATA
MOV DS,AX
MOV AX,DATA
MOV ES,AX
MOV AL,N
CMP AL,M ;比较长度是否相等,相等ZF=0,否则ZF=1
JNZ EXIT ; 111111111 JNZ:jump if not zero ,zero 指的是比较结果,而不是ZF标志位的值
LEA SI,STR1
LEA DI,STR2
MOV CL,N
MOV CH,0
CLD
REPE CMPSB ;挨个比较单个字符,如果有一个不等就跳EXIT
JNZ EXIT
LEA DX,RIGHT
JMP OUT1 ; 2222222222
EXIT:
LEA DX,MESS
OUT1:
MOV AH,9
INT 21H
MOV AH,4CH
INT 21H
CODE ENDS
END BEGIN
当你手写完一个程序后编译时除1 2 处其它代码已经知道长度,然后填充两处跳转,所以都是固定值
2. 高级写法,及高级语言写程序
jmp后能跟动态值,短跳转我还没看到有动态的,还不确定,短跳转一般是判断的时候使用
比如用jmp来call动态链接库里函数时,因为动态链接库是在运行时载入,载入地址不确定,就需要动态地址
|