ASM16

BCD码加、减调整指令

BCD调整指令主要有四种(乘法和除法的不做要求):
DAA压缩型BCD数加法调整指令
AAA非圧缩型BCD数加法调整指令

DAS压缩型BCD数减法调整指令
AAS非圧缩型BCD数减法调整指令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
(ADD AL,i8/r8/m8)
(ADC AL,i8/r8/m8)
AAA
; AL<-将AL的加和调整为非压缩码BCD码
; AH<-AH+调整的进位

(SUB AL,i8/r8/m8)
(SBB AL,i8/r8/m8)
AAS
; AL<-将AL的减差调整为非压缩BCD码
;AH<-AH - 调整的借位

(ADD AL,i8/r8/m8)
(ADC AL,i8/r8/m8)
DAA
; AL<-将AL的加和调整为压缩BCD码

(SUB AL,i8/r8/m8)
(SBB AL,i8/r8/m8)
DAS
; AL<-将AL的减差调整为压缩BCD码
  • 使用AAA或AAS指令前,应先执行以AL为目的操作数的加法或减法指令

  • AAA和AAS指令在调整中产生了进位或错位,则AH要加上进位或减去借位,同时CF=AF=1,否则CF=AF=0;它们对其他标志无定义

  • 使用DAA或DAS指令前,应先执行以AL为目的操作数的加法或减法指令

AAA:

image-20240912160828737

image-20240912160303787

控制转移类指令

  • 控制转移类指令用于实现分支、循环、过程等程序结构,是仅次于传送指令的最常用指令

在这里插入图片描述

在这里插入图片描述

image-20240913210604149

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Jump     跳转/转移

Not 不

Equal 相等

Zero 零(是否为零)

Less 小于(有符号)

Greater 大于(有符号)

Above 大于(无符号)

Below 小于(无符号)

JMP:
JMP(jump)指令可以实现短、近、远转移,使用方便,包括段内直接转移、段内间接转移、段间直接转移、段间间接转移。

短是指要跳至的目标地址与当前地址前后相差不超过128字节。

近是指跳转的目标地址与当前地址在用一个段内,即CS的值不变,只改变EIP的值。

远指跳到另一个代码段去执行,CS/EIP都要改变。

1、段内直接转移
指令格式:JMP label ;label为转移目标
执行操作:
短转移,(IP)<——(IP)+8位相对位移量
近程转移,(IP)<——(IP)+16位相对位移量

若label在JMP指令的(-128~127)字节之内,则会自动产生一个短转移(SHORT);否则便会产生一个在(-32768~32767)之间的近程转移(NEAR)。

image-20240912171147986

1
2
3
4
短转移
jmp short LOOP1
近转移
jmp near ptr LOOP1

image-20240912164853311

跳转7个字节 本身为0007 加上本身3个字节 于是跳转到0011

image-20240912171523339

判断单个标志位状态

  • 这组指令单独判断五个状态标志之一

    (1)JZ/JE和JNZ/JNE:利用零标志ZF,判断结果是否为零(或相等)

    (2)JS和JNS: 利用符号标志SF,判断结果是正是负

    (3)JO和JNO: 利用溢出标志OF,判断结果是否产生溢出

    (4)JP/JPE和JNP/JPO:利用奇偶标志PF,判断结果中“1”的个数是偶是奇

    (5)JC/JB/JNAE和JNC/JNB/JAE:利用进位标志CF,判断结果是否进位或借位

比较无符号数高低

  • 无符号数的大小用高(ABove)低(Below)表示

  • 利用CF确定高低、利用ZF标志确定相等

  • 两数的高低分成四种关系:
    (1)低于(不高于等于):JB(JNAE)

    (2)不低于(高于等于):JNB(JAE)

    (3)低于等于(不高于):JBE(JNA)

    (4)不低于等于(高于):JNBE(JA)

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
30
31
32
33
34
35
36
37
38
39
;switch 1 2 3
cmp ax,1
je CASE1
cmp ax,2
je CASE2
cmp ax,3
je CASE3
CASE1:
mov bx, 1
jmp CASE_END1
CASE2:
mov bx, 2
jmp CASE_END1
CASE3:
mov bx, 3
jmp CASE_END1
DEFAULT1:
mov bx,4
CASE_END1:
mov ax,4c00h
int 21h;

;循环 do-while while
mov cx,3
LOOP1:
inc ax
dec cx
jnz LOOP1
;while
mov cx,3
LOOP2:
cmp cx,0
jnz LOOP2_END
inc ax
dec cx
jmp LOOP2
LOOP2_END:
mov ax,4c00h
int 21h;