一、实验要求
- 将 ASCII 码表示的十进制数转换为二进制数。
十进制表示为:Dn × 10n + Dn-1 × 10n-1 + … + D0 × 100 = ∑ i = 0 n \sum_{i=0}^n ∑i=0n Di × 10i
Di代表十进制数0,1,2,…,9;
上式转换为: ∑ i = 0 n \sum_{i=0}^n ∑i=0n Di × 10i = (…((Dn × 10 + Dn-1) × 10 + Dn-2) × 10 + … + D1) × 10 + D0 (*)
由式 * 可归纳十进制数转换为二进制数的方法:从十进制数的最高位Dn开始作乘10加次位的操作,依次类推,则可求出二进制数的结果。
- BCD 码转换为二进制数。
将四个二位十进制数的 BCD 码存放于 3500H 起始的内存单元中,将转换的二进制数存入 3510H 起始的内存单元中,自行绘制流程图并编写程序。 - 两个非压缩 BCD 数加法程序。
要求:被加数和加数均为 4 位数,从键盘输入,分别放在 SBCD1 和 SBCD2 开始的地址单元中。运算结果放在 SSUM 开始的地址单元中。并在虚拟终端上以“SBCD1+SBCD2=SSUM”格式进行显示。 - 从键盘上输入任意两个不大于 2 位数的正整数,计算其乘积。结果在屏幕上显示。
二、实验目的
- 掌握不同进制数及编码相互转换的程序设计方法,加深对数制转换的理解。
- 熟悉在EMU8086集成环境中程序调试的方法。
- 掌握使用运算类指令编程及调试方法。
- 掌握运算类指令对各状态标志位的影响及其测试方法。
- 学习使用软件监视变量的方法。
三、实验代码及实验结果
- 实验流程图:
实验代码:
DATA SEGMENT
INDEX DB 30H,30H,32H,35H,36H
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START:
MOV AX, DATA
MOV DS, AX
MOV SI, OFFSET INDEX
MOV CX,5
FOR1:
MOV AL,[SI]
SUB AL,30H
MOV [SI],AL
INC SI
LOOP FOR1
MOV AX,0000h
MOV BX,0000h
LEA SI,INDEX
MOV DX,10000
MOV AL,[SI]
IMUL DX
MOV BX,AX
MOV DX,1000
INC SI
MOV AL,[SI]
IMUL DX
ADD BX,AX
MOV DX,100
INC SI
MOV AL,[SI]
IMUL DX
ADD BX,AX
MOV DX,10
INC SI
MOV AL,[SI]
IMUL DX
ADD BX,AX
INC SI
MOV AL,[SI]
ADD BX,AX
MOV AX,BX
CODE ENDS
END START
实验结果:
2.
实验代码:
CODE SEGMENT
ASSUME CS:CODE
START:
MOV SI,3500H
MOV [SI],01
MOV [SI+1],02
MOV [SI+2],03
MOV [SI+3],04
MOV [SI+4],05
MOV [SI+5],06
MOV [SI+6],07
MOV [SI+7],08
MOV CX,4
MOV DI,3510H
MOV AX,0000H
MOV BX,000AH
MOV DX,0000H
FOR:
MOV AL,DS:[SI]
IMUL BL
MOV DX,DS:[SI+1]
AND DX,00FFH
ADC AX,DX
MOV DS:[DI],AL
ADD SI,2
INC DI
LOOP FOR
MOV AX, 4C00H
INT 21H
CODE ENDS
END START
实验结果:
3. 实验流程图:
实验代码:
DATA SEGMENT
STRI1 DB 5 DUP(0)
STRI2 DB 5 DUP(0)
ADDC DB '+'
EQUAL DB '='
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:DATA
START PROC FAR
PUSH DS
MOV AX,0
PUSH AX
MOV AX,DATA
MOV DS,AX
MOV AH,1H
INT 21H
SUB AL,30H
MOV STRI1+3,AL
MOV AH,1H
INT 21H
SUB AL,30H
MOV STRI1+2,AL
MOV AH,1H
INT 21H
SUB AL,30H
MOV STRI1+1,AL
MOV AH,1H
INT 21H
SUB AL,30H
MOV STRI1,AL
MOV DL,0AH
MOV AH,2H
INT 21H
MOV DL,0DH
MOV AH,2H
INT 21H
MOV AH,1H
INT 21H
SUB AL,30H
MOV STRI2+3,AL
MOV AH,1H
INT 21H
SUB AL,30H
MOV STRI2+2,AL
MOV AH,1H
INT 21H
SUB AL,30H
MOV STRI2+1,AL
MOV AH,1H
INT 21H
SUB AL,30H
MOV STRI2,AL
MOV DL,0AH
MOV AH,2H
INT 21H
MOV DL,0DH
MOV AH,2H
INT 21H
MOV SI,OFFSET STRI1
PUSH [SI]
PUSH [SI+1]
PUSH [SI+2]
PUSH [SI+3]
MOV DI,OFFSET STRI2
PUSH [DI]
PUSH [DI+1]
PUSH [DI+2]
PUSH [DI+3]
MOV CX,5
CLC
CYCLE:
MOV AL,[SI]
ADC AL,[DI]
AAA
MOV [DI],AL
INC SI
INC DI
LOOP CYCLE
MOV CX,4
S:
POP DX
ADD DL,30H
MOV AH,2
INT 21H
LOOP S
MOV DL,ADDC
MOV AH,2
INT 21H
MOV CX,4
S2:
POP DX
ADD DL,30H
MOV AH,2
INT 21H
LOOP S2
MOV DL,EQUAL
MOV AH,2
INT 21H
MOV SI,OFFSET STRI2
MOV DL,[SI+4]
ADD DL,30H
MOV AH,2
INT 21H
MOV DL,[SI+3]
ADD DL,30H
MOV AH,2
INT 21H
MOV DL,[SI+2]
ADD DL,30H
MOV AH,2
INT 21H
MOV DL,[SI+1]
ADD DL,30H
MOV AH,2
INT 21H
MOV DL,[SI+0]
ADD DL,30H
MOV AH,2
INT 21H
RET
START ENDP
CODE ENDS
END START
实验结果:
4.
实验代码:
DATA SEGMENT
STR1 DB 'PLEASE INPUT THE FIRST NUMBER:$'
STR2 DB 'PLEASE INPUT THE SECOND NUMBER:$'
STR3 DB 'RESULT=$'
A DW ?
B DW ?
C DW ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
MAIN PROC FAR
START:
MOV AX,DATA
MOV DS,AX
LEA DX,STR1
MOV AH,9H
INT 21H
CALL INPUT
MOV A,BX
LEA DX,STR2
MOV AH,9H
INT 21H
CALL INPUT
MOV B,BX
LEA DX,STR3
MOV AH,9H
INT 21H
MOV AX,A
AAD
MOV BX,AX
MOV AX,B
AAD
MUL BX
MOV WORD PTR C,AX
MOV DI,0AH
MOV CX,0
TOTEN:
DIV DI
PUSH DX
INC CX
CMP AX,0
JE PRINT
CWD
JMP TOTEN
PRINT:
POP DX
ADD DL,30H
MOV AH,2H
INT 21H
LOOP PRINT
RET
MAIN ENDP
INPUT PROC
MOV BX,0
INPUTA:
MOV AH,1
INT 21H
SUB AL,30H
MOV BL,AL
MOV AH,1
INT 21H
CMP AL,0DH
JE EXIT
SUB AL,30H
MOV CL,8
ROL BX,CL
MOV BL,AL
JMP EXIT
EXIT:
CALL CRLF
RET
INPUT ENDP
CRLF PROC NEAR
MOV DL,0AH
MOV AH,2H
INT 21H
MOV DL,0DH
MOV AH,2H
INT 21H
RET
CRLF ENDP
CODE ENDS
END START
实验结果:
四、实验总结
通过本次实验,我学会了数值转换和数码编程相关的内容,掌握了不同进制数及编码相互转换的程序设计方法,而且加深对数制转换的理解。除此之外,我还学会了运算类指令对各状态标志位的影响及其测试方法和使用软件监视变量的方法。