第三次汇编实验报告.doc
文本预览下载声明
实验报告
实验目的
熟悉新学习的汇编指令
尝试自己写一些可以完整运行的汇编代码
实验内容(主要是PPT上的例子和书本上的一些代码段,包括上次已经做过的实验,但感觉指令依旧不太熟的再做一遍)
CMP比较后标志寄存器的状态
无符号数的比较好比较
若AX=BX,则ZF位为1,即ZR状态
若AXBX,则CF=0,即NC状态
若AXBX,则CF=1,即CY状态
BCD码运算调整指令复习
压缩BCD码加法十进制调整指令DAA,调整在运算之后进行,若AL的第四位9或AF=1,
AL=AL+06H,且AF=1,若AL的高四位9或CF=1,则AL=AL+60H,CF=1
非压缩BCD码加法十进制调整指令AAA,也在运算之后调整,若AL中第四位9或者AF=1,则AH=AH+1,AF=1,AL中的高四位屏蔽,CF=AF.
压缩BCD码减法十进制调整指令DAS,运算后调整,若AL低四位9或者AF=1(即高位借给低位时多按十六进制多借了6,现在减去这个多借的6),,则AL=AL-06,AF=1,若AL中的高四位9或者CF=1,则AL=AL-60,CF=1(同理,比AL高的位给AL借时多给了60H)
非压缩BCD码减法调整指令AAS,运算后调整,若AL中低四位9或AF=1(减法中AF表示的意思有点悬念,是否高8位向低8位借位后AF就变成1,问一问),则AL=AL-06,AH=AH-1,AF=1,屏蔽AL高四位,CF=AF.(非压缩BCD码以八位存放一个十进制数,一般前四位都为空,,进行运算后也不可能大于9,所以只需要考虑低四位,比AL高的位借一过来由于十六进制和十进制的差异多了6H,所以要减去6H,
最后的结果是有问题的,为什么?
非压缩BCD码乘法的十进制调整指令AAM
将运算结果得到的十六进制转化为十进制,AH=(AX)/0A,AL=AX%0A
非压缩BCD码除法的十进制调整指令AAD
这条指令放在除法之前,AL=(AH*10)+AL,AH=0
逻辑运算和移位指令.
AND AX,AX和OR AX,AX都可以让CF和OF清零
将某个寄存器清零可以用XOR XX,XX
TEST用来测试某些位的状态。
使用移位指令时,若移动次数为1,则写1,不然就用CL
将BUF1开始存放的四个压缩BCD码转换为ASCII码存放在BUF2开头的单元中
DATA SEGMENT
BUF1 DB 12H,34H,56H,78H
BUF2 DB 4 DUP(0)
DATA ENDS
CODE SEGMENT
ASSUME DS:DATA,CS:CODE
START:
MOV AX,DATA
MOV DS,AX
LEA SI,BUF1
LEA DI,BUF2
MOV CX,4
NEXT:MOV AL,[SI]
MOV BL,AL
AND AL,0FH
OR AL,30H
MOV [DI],AL
INC DI
MOV AL,BL
PUSH CX
MOV CL,4
SHR AL,CL
OR AL,30H
MOV [DI],AL
INC DI
INC SI
POP CX
DEC CX
JNZ NEXT
HLT
MOV AX,4CH
INT 21
CODE ENDS
END START
串操作指令
串传送指令使用的尝试
DATA1 SEGMENT
MEM1 DB 200 DUP(2)
DATA1 ENDS
DATA2 SEGMENT
MEM2 DB 200 DUP(0)
DATA2 ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA1,ES:DATA2
START:
MOV AX,DATA1
MOV DS,AX
MOV AX,DATA2
MOV ES,AX
LEA SI,MEM1
LEA DI,MEM2
MOV CX,200
CLD
REP MOVSB
HLT
MOV AX,4CH
INT 21H
CODE ENDS
END START
这段代码的功能是将MEM1开始的200个字节存储单元的内容传送到MEM2开始的200个字节的存储单元中
结果如下图所示
当然,上面的MOVSB指令可以用movs BYTE PTR[DI],[SI]的方式表示,运行结果一样。
SCAS的使用
DATA SEGMENT
STR DB I LOVE CHINA
COUNT EQU $-STR
F DW -1
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
显示全部