1- jcxz指令
指令为有条件转移指令, 所有的有条件转移指令都是短转移, 在对应的机器码中包含转移的位移, 而不是目的地址, 对IP的修改范围为: -128 ~ 127
指令格式: jcxz 标号(如果(cx) = 0 ,转移到标号处执行)
1 ;利用jcxz指令,现实在内存2000H段中查找第一个值为0的字节,找到后,将它的偏移地址存储在dx中. 2 assume cs:codesg 3 codesg segment 4 start: mov ax,2000H 5 mov ds,ax 6 mov bx,0 7 s: mov cl,[bx] 8 mov ch,0 9 jcxz ok 10 inc bx 11 jmp short s 12 13 ok: mov dx,bx 14 15 mov ax,4c00h 16 int 21h 17 codesg ends 18 end start
2- loop指令
loop指令为循环指令, 所有的循环指令都是短转移, 在机器码中包含转移的位移, 而不是目的地址, 对IP的修改范围为 -128~127
指令格式: loop 标号 ((cx) = (cx) - 1, 如果(cx) != 0, jmp short s)
3- 根据位移进行转移的意义
jmp short s
jmp near ptr s
jcxz s
loop s
以上都是通过位移进行转移.
mov cx,6 B9 06 00
mov ax,10 B8 10 00
s: add ax,ax 01 C0
loop s E2 FC
FC = 1111 1100 = -4 表示执行到loop s之后, 前移4个字节
4- 编辑器对转移位移超界的检测
1 assume cd:code 2 code segment 3 start: jmp short s 4 db 128 dup (0) 5 s: mov ax,0fffh 6 code ends 7 end start
jmp short s转移的范围 -128~127 ,IP最多向后移动127个字节.
以上程序编辑器将报错,转移范围超出界限.
5-
1 assume cs:codesg 2 codesg segment 3 4 mov ax,4c00H 5 int 21h 6 start: 7 mov ax,0 8 s: 9 nop 10 nop 11 12 mov di, offset s 13 mov si, offset s2 14 mov ax,cs:[si] 15 mov cs:[di],ax 16 s0: jmp short s 17 s1: mov ax,0 18 int 21h 19 mov ax,0 20 s2: jmp short s1 21 nop 22 23 codesg ends 24 end start
执行完 mov cs:[di],ax后 是把s2标号处的语句复制到s处.
[汇编语言]-第九章 jcxz,loop指令,转移位移的意义,布布扣,bubuko.com
[汇编语言]-第九章 jcxz,loop指令,转移位移的意义
原文:http://www.cnblogs.com/galoishelley/p/3579992.html