简单的do-while,先循环再判断

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
MyStack segment stack      
db 256 dup(?)
MyStack ends

MyData segment
MSG1 db "Hello World!",0dh,0ah,'$'
MyData ends

MyCode segment
MAIN:
mov ax,MyData
mov ds,ax
mov es,ax

;循环 do-while
mov cx,3
LOOP1:
inc ax
dec cx
jnz LOOP1

mov ax,4c00h
int 21h

MyCode ends

end MAIN

常规的while写法,先判断再循环

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
MyStack segment stack      
db 256 dup(?)
MyStack ends

MyData segment
MSG1 db "Hello World!",0dh,0ah,'$'
MyData ends

MyCode segment
MAIN:
mov ax,MyData
mov ds,ax
mov es,ax

;while
mov cx,3
LOOP2:
cmp cx,0
jz LOOP2_END
inc ax
dec cx
jmp LOOP2
LOOP2_END:
mov ax,4c00h
int 21h

MyCode ends

end MAIN

改进后的while循环,可以减少循环的代码数(和2相比循环的部分少一个 jz LOOP2_END)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
MyStack segment stack      
db 256 dup(?)
MyStack ends

MyData segment
MSG1 db "Hello World!",0dh,0ah,'$'
MyData ends

MyCode segment
MAIN:
mov ax,MyData
mov ds,ax
mov es,ax

mov cx,3
jmp LOOP3_CMP
LOOP3:
inc ax
dec cx
LOOP3_CMP:
cmp cx,0
jnz LOOP3

mov ax,4c00h
int 21h

MyCode ends

end MAIN

补充知识

段间间接远转移

image-20240804215832895

段间间接原转移的OPR是存储器的地址

image-20240804215952599

1
JMP DWORD PTR TABLE[BX]

TABLE是数据段中定义的变量,偏移地址为0010H,(DS)=1000H,BX=0005H
所以TABLE[BX]的地址是10015H,内容是78563412H
低地址内容送IP,高地址内容送CS
所以(IP)=3412H,(CS)=7856H

直接寻址和间接寻址

  • 直接寻址(Direct addressing)是指在指令中明确要操作的数据的地址,处理器可以直接访问该地址并进行读取或写入操作。

    1
    jmp IF_ELSE_END1
  • 间接寻址(Indirect addressing)是指在指令中给出的是一个指向要操作的数据地址,处理器首先访问该地址,再获取实际数据的地址,最后才进行相应的读/写操作。

    1
    jmp word ptr [1000]