资源描述
实验二 算术运算
汇编语言实验报告
(二)
班 级:01540802班
姓 名: 南 征
学 号: 20080705
信息与电子学院
实验二 算术运算
一、 实验目的
熟悉利用汇编语言对多精度十六进制和十进制的编程方法,弄清带符号数及不带符号数的运算区别,理解各状态标志位的含义,以及运算结果对各状态标志的影响,掌握无符号数的乘除法运算并保证运算结果不溢出。
二、 实验要点
对汇编语言的算术运算要分清是有符号的运算还是无符号的运算,当对无符号数进行加减时,要考虑进位CF,对于有符号数进行加减时,要考虑运算结果是否溢出。为防止溢出,常将操作数利用CBW或CWD指令进行符号扩展后再进行加减运算。对于多精度的加减运算时,对高位字节或字的加减法要分别采用ADC和DBB;对低位字节或字采用不带进位的加减指令ADD和SUB;在利用循环计算多字节的加减法时,可以用CLC指令将CF初始化为0,然后在循环体内统一使用带进位(或借位)的加减法指令。
在汇编语言进行十进制的加减运算时,首先需将操作数用BCD码示,并且要考虑操作数是用组合的BCD码还是用一个字节表示一个十进制数。对于组合的BCD码加减法,其结果应放在AL寄存器中,再用DAA和DAS指令进行二——十进制调整。二对于未组合的BCD码加减法,用AAA和AAS对结果进行二——十进制调整。此外在进行十进制数减法时,要考虑用大数减小数,因为十进制数运算不能用补码表示。
对于有符号数惩罚要用IMUL指令,对无符号数乘法要用MUL指令。字乘时AX为约定的一个乘数,其积在DX:AX中;字节相乘时AL为约定的一个乘数,其积在AX中。乘法指令中的操作数,不得为立即数,可以为通用寄存器或存储器操作数。
对于除法要用IDIV、DIV分别对有符号数和无符号数进行除法运算。字除法时被除数约定在DX:AX中;字节相除时,被除数约定在AX中,除法指令中的操作数可以为通用寄存器或者存储器操作数,但不得是立即数。在进行除法运算时要考虑除数是否为零,以及其商是否溢出,在出现除零溢出时,将产生类型号为0的内部中断。
三、 实验任务及步骤
1. 在数据段中一缓冲区内存放有无符号数0ABH和78H,64H和54H;试编程求这两组数的和、差,并将结果填入表格:
代码如下:
DATA SEGMENT
DATA1 DB 0ABH, 64H
DATA2 DB 78H, 5AH
COUNT EQU $-DATA2
DATA3 DW 6 DUP(0)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:DATA
MAIN PROC FAR
START:
MOV AX, DATA
MOV DS, AX
MOV ES, AX
LEA SI, DATA1
LEA DI, DATA2
LEA BX, DATA3
MOV CX, COUNT
AGAIN1:
XOR AH, AH
MOV AL, [SI]
ADC AL, [DI]
ADC AH, 0
MOV [BX], AX
INC SI
INC DI
INC BX
INC BX
DEC CX
JNZ AGAIN1
LEA SI, data1
LEA DI, data2
MOV CX, COUNT
CLC
AGAIN2:
MOV AL, [SI]
SBB AL, [DI]
MOV [BX], AL
INC SI
INC DI
INC BX
DEC CX
JNZ AGAIN2
MOV AH, 4CH
INT 21H
MAIN ENDP
CODE ENDS
END START
运行结果如下:
0B3E:0000 AB 64 78 5A 23 01 BE 00-33 0A 00 00 00 00 00 00
0B3E:0010 B8 3E 0B 8E D8 8E C0 8D-36 00 00 8D 3E 02 00 8D
0B3E:0020 1E 04 00 B9 02 00 32 E4-8A 04 12 05 80 D4 00 89
0B3E:0030 07 46 47 43 43 49 75 EE-8D 36 00 00 8D 3E 02 00
0B3E:0040 B9 02 00 F8 8A 04 1A 05-88 07 46 47 43 49 75 F3
0B3E:0050 B4 4C CD 21 06 4E 91 00-00 2E C7 06 1A 92 5B 5D
0B3E:0060 2E C7 06 1C 92 7C 3C 2E-C7 06 1E 92 3E 2B 2E C7
0B3E:0070 06 20 92 3D 3B E8 83 09-73 13 B8 FF FF 53 26 8B
计算
状态标志
算式
结果
AF
CF
OF
PF
SF
ZF
0ABH+78H
0123
AC
NC
NV
PO
PL
NZ
0ABH-78H
0033
NA
NC
NV
PE
PL
NZ
64H+5AH
00BE
NA
NC
NV
PE
PL
NZ
64H-5AH
000A
AC
NC
NV
PE
PL
NZ
2. 在数据缓冲区BUF内存放有10个学生的数学成绩,78、86、95、67、56、80、92、68、77、88,试编程求总分和平均分,并分别存入SUM字单元和AVERAGE字节单元。
代码如下:
DATA SEGMENT
BUF1 DB 78H,86H,95H,67H,56H,80H,92H,68H,77H,88H
SUM DW 0
AVERAGE DW 0
DATA ENDS
STACK SEGMENT
DB 256 DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK
MAIN PROC FAR
PUSH DS
MOV AX, 0
PUSH AX
MOV AX, DATA
MOV DS, AX
MOV ES, AX
MOV SI, OFFSET BUF1
MOV DI, OFFSET SUM
MOV CX, 9H
MOV AX, 0078H
INC SI
NEXT: MOV BL, [SI]
ADD AL, BL
DAA
ADC AH, 0
INC SI
DEC CX
MOV [DI], AX
JNZ NEXT
MOV [DI], AX
MOV BX, 10H
DIV BX
MOV [DI+2], AX
MOV [DI+4], DX
MOV AH, 4CH
INT 21H
RET
MAIN ENDP
CODE ENDS
END MAIN
运行结果如下:
0B3E:0000 78 86 95 67 56 80 92 68-77 88 87 07 78 00 07 00
0B3E:0010 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
0B3E:0020 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
0B3E:0030 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
0B3E:0040 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
0B3E:0050 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
0B3E:0060 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
0B3E:0070 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
3. 多字加减法
在数据段中有两个缓冲区,存放数据如下:
BUF1 DB 12H 98H 45H 64H 78H
BUF2 DB 33H 46H 17H 45H 52H
编写一源程序,将BUF1和BUF2中的十六进制数,按下列要求计算,并将结果填入下表:
代码如下:
DATA SEGMENT
BUF1 DB 82H,98H,45H,64H,78H
BUF2 DB 33H,46H,17H,45H,52H
COUNT EQU $-BUF2
SUM DB 38 DUP(0)
DATA ENDS
STACK SEGMENT
DB 100 DUP(0)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
MAIN PROC FAR
MOV AX,DATA
MOV DS,AX
MOV ES,AX
LEA SI,BUF1
LEA BX,BUF2
LEA DI,SUM
MOV CX,COUNT
ADD SI,COUNT-1
ADD BX,COUNT-1
ADD DI,37
CLC
STD
A1: LODSB
ADC AL,[BX]
DAA
STOSB
DEC BX
LOOP A1
ADC BYTE PTR[DI],0
DEC DI
LEA SI,BUF1+COUNT-1
LEA BX,BUF2+COUNT-1
MOV CX,COUNT
CLC
STD
A2: LODSB
ADC AL,[BX]
STOSB
DEC BX
LOOP A2
ADC BYTE PTR[DI],0
DEC DI
LEA SI,BUF1+COUNT-1
LEA BX,BUF2+COUNT-1
MOV CX,COUNT-1
CLC
STD
A3: LODSB
ADC AL,[BX]
STOSB
DEC BX
LOOP A3
MOV AL,[SI]
CBW
MOV CL,[BX]
CBW
ADD AX,CX
MOV [DI],AL
MOV[DI-1],AH
DEC DI
DEC DI
LEA SI,BUF1+COUNT-1
LEA BX,BUF2+COUNT-1
MOV CX,COUNT
CLC
STD
S1: LODSB
SBB AL,[BX]
DAS
STOSB
DEC BX
LOOP S1
DEC DI
LEA SI,BUF1+COUNT-1
LEA BX,BUF2+COUNT-1
MOV CX,COUNT
CLC
STD
S2: LODSB
SBB AL,[BX]
STOSB
DEC BX
LOOP S2
DEC DI
LEA SI,BUF1+COUNT-1
LEA BX,BUF2+COUNT-1
MOV CX,COUNT-1
CLC
STD
S3: LODSB
SBB AL,[BX]
STOSB
DEC BX
LOOP S3
MOV AL,[SI]
CBW
MOV CL,[BX]
CBW
SUB AX,CX
MOV [DI],AL
MOV[DI-1],AH
MOV AH,4CH
INT 21H
MAIN ENDP
CODE ENDS
END MAIN
运行结果如下:
0B3E:0000 82 98 45 64 78 33 46 17-45 52 00 00 FF 4F 52 2E
0B3E:0010 1F 26 00 4F 52 2E 1F 26-00 49 52 28 19 26 FF B5
0B3E:0020 DE 5C A9 CA 00 B5 DE 5C-A9 CA 01 16 44 63 10 30
0B3E:0030 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
0B3E:0040 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
0B3E:0050 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
0B3E:0060 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
0B3E:0070 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
无符号结果
有符号结果
十进制结果
BUF1+BUF2
00B5DE5CA9CA
FF4F522E1F26
011644631030
BUF1-BUF2
004F522E1F26
FF B5DE5CA9CA
004952281926
4. 计算280H*584H/190H,运算的结果用十六进制表示。
RESULT = 08D3 + 0050
代码如下:
DATA SEGMENT
DATA1 DW 280H, 584H, 190H
DATA2 DW 1 DUP(0)
DATA ENDS
CODE SEGMENT
ASSUME CS: CODE, DS: DATA, ES: DATA
MAIN PROC FAR
START: MOV AX, DATA
MOV DS, AX
MOV ES, AX
LEA BX, DATA1
MOV DX, 0000H
MOV AX, [BX]
INC BX
INC BX
MUL WORD PTR [BX]
INC BX
INC BX
DIV WORD PTR [BX]
LEA BX, DATA2
MOV [BX], AX
INC BX
INC BX
MOV [BX], DX
MOV AH, 4CH
INT 21H
MAIN ENDP
CODE ENDS
END START
运行结果如下:
0B3E:0000 80 02 84 05 90 01 D3 08-50 00 00 00 00 00 00 00
0B3E:0010 B8 3E 0B 8E D8 8E C0 8D-1E 00 00 BA 00 00 8B 07
0B3E:0020 43 43 F7 27 43 43 F7 37-8D 1E 06 00 89 07 43 43
0B3E:0030 89 17 B4 4C CD 21 26 E1-91 2E 89 36 E3 91 FC 2E
0B3E:0040 89 0E 48 91 2E C7 06 4A-91 00 00 2E C7 06 5D 91
0B3E:0050 00 00 2E C7 06 4E 91 00-00 2E C7 06 1A 92 5B 5D
0B3E:0060 2E C7 06 1C 92 7C 3C 2E-C7 06 1E 92 3E 2B 2E C7
0B3E:0070 06 20 92 3D 3B E8 83 09-73 13 B8 FF FF 53 26 8B
四、 实验心得
通过本次实验基本掌握了运用汇编语言进行加、减、乘、除算术运算的方法,在实验过程中遇到了关于进位标志和辅助进位标志等状态标志的一些问题,解决这些问题使笔者加深了对状态标的理解。实验中还进行了十进制转换以及类型转换等操作,对这些操作也有了全新的理解和认识。本次实验还涉及到了一些循环结构,这也是今后在运用汇编语言进行程序编写过程中最为常用的一种结构。
8
展开阅读全文