[汇编语言]-第九章 jcxz,loop指令,转移位移的意义

 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处.

原文地址:https://www.cnblogs.com/galoishelley/p/3579992.html