|
发表于 2018-2-11 15:01:21
|
显示全部楼层
回帖奖励 +20 鱼币
本帖最后由 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动态链接库里函数时,因为动态链接库是在运行时载入,载入地址不确定,就需要动态地址
|
|