实验内容:
第一题:
1.用16位指令编制程序,处理16位带符号数的计算:((a+b)-(c x d))/e,其中a、b、c、d、
e均为16位带符号数。要求:
(1)商和余数存放在内存中
(2)在调试状态下,在看加法运算后的结果及ZF、SF、CF、OF标志位情况,并分析原因
(3)在调试状态下,查看数据段数据的存储情况
DATA SEGMENT
A DW 0014H
B DW 0018H
C DW 0004H
D DW 0002H
E DW 0002H
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV AX,A
ADD AX ,B
MOV CX,AX
MOV BX,DX
MOV AX,C
CWD
IMUL D
SUB AX,CX
SBB DX,BX
IDIV E
MOV A,AX
MOV B,BX
MOV AH,4CH
INT 21H
CODE ENDS
END START
- 相关知识:
- 结果不为0,zf显示NZ(not zero),结果为0,zf显示ZR(zero)
- SF为符号,结果为负,SF=1,显示NG(negative number);如果非负,SF=0,显示PL(positive number)
- CF,进位标志位,CF为CY(carry),表示进位;CF为NC(not carry),表示没有进位
- OF为NV(not over flow),表示没有溢出;OF为OV(over flow),表示溢出
解答:
(2)加法运算后的结果为002C,ZF结果为NZ即不是0,SF为PL即正数,CF为NC即没有进位,OF为NV即没有溢出
(3)
第二题
2.双字长数X存放在DX和AX中,设(DX)=1004H,(AX)=1002H,编程实现:
(1)对存放在DX和AX中的双字长数求补,并在debug下查看结果
(2)用减法指令求0-X,并在debug下查看结果
DATA SEGMENT
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV AX,1002H
MOV DX,1004H
MOV CX,AX
MOV BX,DX
MOV AX,0
CWD
SUB AX,CX
SBB DX,BX
MOV AH,4CH
INT 21H
CODE ENDS
END START
解答:
(1)
NOT AX
NOT DX
ADD AX,1
ADD DX,0
(2)
实验总结:
本次试验主要是对上课内容的总结与模仿,比如第一题,课本上有一道相近题目,不一样的店在于,本题要求将最后的结果存至内存中,即最后要将寄存器中的值转移到内存中,我采取的方法是将其送回至存储在内存中的变量,其次在回答第二问的各个标志位时,也加深了我对于标志位的认识,再次熟悉了数据段中内容。
第二个实验,用到了求补也就是取相反数,根据课上老师的提示,我采取了not的用法,根据查询资料,我知道neg其实也是可以等效适用的,
NEG DX
NEG AX
SBB DX, 0
以及求补在最终结果上与0-x实际为等效。
根据这两次试验的综合感觉,对汇编的印象就是觉得这门语言非常繁琐和松散,里面有很多小的知识点,而且有很多规定,必须要严格遵守规则才能编写出正确的程序。