ASCII--BCD码运算调整指令
前面介绍的算术运算指令都是针对二进制数进行操作的指令,但对绝大多数人来说,十进制是最简单、熟悉的。为了方便按十进制数进行算术运算,指令系统专门提供了一组十进制运算调整指令。
虽然人们会觉得按十进制进行算术运算很自然,但计算机要化更多的时间来完成相应操作。在通常情况下,这组指令很少被程序员运用在实际的程序之中。所以,这组指令的使用率较低,可以根据需要有选择性地学习。
1、ASCII码加调整指令AAA(Ascii Adjust After Addition)
该指令是用于调整AL之值,该值是二个ASCII码字节相加之和。具体的调整规则如下:
、若AL的低四位大于9,或标志位AF=1,则,AH=AH 1,AL=AL 6,并置AF和CF为1,否则,只置AF和CF为0;
、清除AL的高四位。
指令的格式:AAA
受影响的标志位:AF和CF(OF、PF、SF和ZF等都是无定义)
例5.21 编写一段程序,完成二个15位十进制数X和Y之和,并把计算结果存入X之中。假设数据X和Y都是以字符串形式表示的。
解: |
|||
|
… |
||
X |
db "456407983123186" |
;任意假设二个15位的大数 |
|
Y |
db "326676709587211" |
||
… |
|||
CLC |
|||
MOV |
SI, 14 |
;用变址寄存器SI来从字符串的后面向前访问 |
|
MOV |
CX, 15 |
;因为它们是二个15位十进制数 |
|
loop1: |
MOV |
AL, X[SI] |
|
ADC |
AL, Y[SI] |
;把被加数加上 |
|
AAA |
|||
MOV |
X[SI], AL |
||
DEC |
SI |
||
LOOP |
loop1 |
;15位十进制数相加完毕 |
|
LEA |
BX, X |
;下面5条指令是把X中的数据变成对应的字符 |
|
MOV |
CX, 15 |
||
loop2: |
ADD |
byte ptr [BX], '0' |
|
INC |
BX |
||
LOOP |
loop2 |
||
… |
从上例可以看出,其实任意位的十进制数也都是可以的,只要改变CX的值即可。
2、ASCII码减调整指令AAS(Ascii Adjust After Subtraction)
该指令是用于调整AL之值,该值是二个ASCII码字节相减之差。具体的调整规则如下:
、若AL的低四位大于9,或标志位CF=1,则,AH=AH-1,AL=AL-6,并置AF和CF为1,否则,只置AF和CF为0;
、清除AL的高四位。
指令的格式:AAS
受影响的标志位:AF和CF(OF、PF、SF和ZF等都是无定义)
3、ASCII码乘调整指令AAM(Ascii Adjust After Multiplication)
该指令是用于调整寄存器AL之值,该值是由二个单BCD码字节用无符号乘指令MUL所得的积。其调整规则如下:
AH←AL/10(商),AL←AL%10(余数)
指令的格式:AAM
受影响的标志位:PF、SF和ZF(AF、CF和OF等都是无定义)
例如:
MOV AL, 9
MOV BL, 8
MUL BL ;AL=72D
AAM ;AH=7, AL=2
4、ASCII码除调整指令AAD(Ascii Adjust After Division)
该指令是在作除法前用于调整寄存器AH和AL之值,它是把二个寄存器中单BCD码组成一个十进制数值,为下面的除法作准备的。其调整规则如下:
AL←AH*10 AL,AH←0
指令的格式:AAD
受影响的标志位:PF、SF和ZF(AF、CF和OF等都是无定义)
例如:
MOV AX, 0502H
MOV BL, 10D
AAD ;AH=0, AL=52D
DIV BL ;AH=2(余数), AL=5(商)
5、十进制数加调整指令DAA(Decimal Adjust After Addition)
该指令是用于调整AL的值,该值是由指令ADD或ADC运算二个压缩型BCD码所得到的结果。压缩型BCD码是一个字节存放二个BCD码,低四位和高四位都是一个BCD码。
其调整规则如下:
、如果AL的低四位大于9,或标志位AF=1,那么,AL=AL 6,并置AF=1;
、如果AL的高四位大于9,或CF=1,那么,AL=AL 60H,并置CF=1;
、如果以上两点都不成立,则,清除标志位AF和CF。
经过调整后,AL的值仍是压缩型BCD码,即:二个压缩型BCD码相加,并进行调整后,得到的结果还是压缩型BCD码。
指令的格式:DAA
受影响的标志位:AF、CF、PF、SF和ZF(OF无定义)
例如:
MOV AL, 43H
MOV BL, 29H
ADD AL, BL ;AL=6BH,其不是压缩型的BCD码,因为低四位'B'不是BCD码
DAA ;调整后,AL=72H,这是压缩型的BCD码,也有:43 29=72
6、十进制数减调整指令DAS(Decimal Adjust After Subtraction)
该指令也是用于调整AL的值,该值是由指令SUB或SBB运算二个压缩型BCD码所得到的结果。其调整规则如下:
、如果AL的低四位大于9,或标志位AF=1,那么,AL=AL-6,并置AF=1;
、如果AL的高四位大于9,或CF=1,那么,AL=AL-60H,并置CF=1;
、如果以上两点都不成立,则,清除标志位AF和CF。
经过调整后,AL的值仍是压缩型BCD码,即:二个压缩型BCD码相减,并进行调整后,得到的结果还是压缩型BCD码。
指令的格式:DAS
受影响的标志位:AF、CF、PF、SF和ZF(OF无定义)
例如:
MOV AL, 43H
MOV BL, 29H
SUB AL, BL ;AL=1AH,其不是压缩型的BCD码,因为低四位'A'不是BCD码
DAS ;调整后,AL=14H,这是压缩型的BCD码,也有:43-29=14
5.2.13 处理器指令
处理器指令是一组控制CPU工作方式的指令。这组指令的使用频率不高。
1、空操作指令NOP(No Operation Instruction)
该指令没有的显式操作数,主要起延迟下一条指令的执行。通常用执行指令“XCHG AX, AX”来代表它的执行。NOP指令的执行不影响任何标志位。
指令的格式:NOP
2、等待指令WAIT(Put Processor in Wait State Instruction)
该指令使CPU处于等待状态,直到协处理器(Coprocessor)完成运算,并用一个重启信号唤醒CPU为止。该指令的执行不影响任何标志位。
指令的格式:WAIT
3、暂停指令HLT(Enter Halt State Instruction)
在等待中断信号时,该指令使CPU处于暂停工作状态,CS:IP指向下一条待执行的指令。当产生了中断信号,CPU把CS和IP压栈,并转入中断处理程序。在中断处理程序执行完后,中断返回指令IRET弹出IP和CS,并唤醒CPU执行下条指令。
指令的格式:HLT
指令的执行不影响任何标志位。
4、封锁数据指令LOCK(Lock Bus Instruction)
该指令是一个前缀指令形式,在其后面跟一个具体的操作指令。LOCK指令可以保证是在其后指令执行过程中,禁止协处理器修改数据总线上的数据,起到独占总线的作用。该指令的执行不影响任何标志位。
指令的格式:LOCK INSTRUCTION