微机原理上机实验答案
程序如下:
DATA SEGMENT
ORG 1000H
H1 DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H
H2 DB 1 DUP(?)
TIP DB 13,10,"The input number must be a HEX (0~F), press <ESC> to quit.",13,10,'$'
H1 DB 10 DUP(?)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START PROC FAR
STT:PUSH DS
SUB AX,AX
PUSH AX
Movax,dseg
Movds,ax
;==============================
MOV SI,1000H
MOV [SI],AL
CMP AL,27 ;如果按下<ESC>键,跳至QUIT
JZ QUIT
CALL DISPLAY0 ;调用DISPLAY0子程序
CALL ASCII2HEX ;调用ASCII2HEX子程序
CMP AL,0FFH ;如果AL不等于FF(出错码)则跳至CORRECT
JNZ CORRECT
MOV AH,09H
INT 21H
SUB CX,CX ;CX清零
SUB DX,DX ;DX清零
CLC ;清CF
MOV AH,1 ;输入第1个数
INT 21H
MOV CH,AL ;放入CH
SUB CH,30H ;ASCII码调整
INT 21H ;输入第2个数
MOV CL,AL ;放入CL
SUB CL,30H ;ASCII码调整
LEA DX,ERR ;打印错误信息
MOV AH,09H
INT 21H
JMP FINISH ;跳至FINISH
CORRECT:
MOV BX,OFFSET H1 ;查表
XLAT
MOV AH,0
MOV BX,0
MOV BL,AL ;分离AL的高4位和低4位,分离后AL中为高4位,BL中为低4位
ANDAL,0F0H
RET
START ENDP
CODE ENDS
END STT
实验03B
从内存1000H开始,建立19个自然递增然后又递减的数据串(0-9-0),用DEBUG查看运行结果。
程序如下:
DATA SEGMENT
ORG 1000H
H1 DB 20 DUP(?)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
MOV BX,AX
MOV CX,AX
MOV DX,AX
MOV SI,AX
MOV DI,AX
MOV BP,AX
;==============================
RET
START ENDP
CODE ENDS
END STT
实验01B
将FFH送到内存1000H,1001H,1002H,1003H,1004H单元中
ADC DL,0
MOV DI,1009H
MOV [DI],DL
;==============================
RET
START ENDP
CODE ENDS
END STT
实验02B
用串传送指令把A程序的数据块(被加数、加数、和)偏移地址1000H开始的区域传递到同一数据段的偏移地址为1010H开始的区域,并利用DEBUG查看运行结果
MOV AH,2 ;打印加号
MOV DL,2BH
INT 21H
MOV AH,1 ;输入第3个数
INT 21H
MOV DH,AL ;放入DH
SUB DH,30H ;ASCII码调整
INT 21H ;输入第4个数
MOV DL,AL ;放入DL
SUB DL,30H ;ASCII码调整
ADD CL,DL ;ASCII码个位加法
MOV AX,DATA
MOV DS,AX
LEA DX,TIP ;打印TIP信息
MOV AH,09H
INT 21H
BEGIN:
MOV DL,13 ;打印换行
MOV AH,2
INT 21H
MOV DL,10 ;打印回行首
INT 21H
MOV AH,1 ;等待从键盘输入
INT 21H
MOV SI,OFFSET H2 ;保护输入
CMP CL,10;比较个位数结果是否大于10
JNC AA ;大于等于10则跳至AA
ADD CH,DH;个位不向十位进位的十位加法
JMP BB
AA: ADD CH,DH ;个位向十位有进位的十位加法
ADD CH,1
SUB CL,10
BB: MOV DL,3DH ;打印等号
MOV AH,2
INT 21H
START PROC FAR
STT:PUSH DS
SUB AX,AX
PUSH AX
;==============================
MOV SI,OFFSET H1
MOV DI,OFFSET H1
ADD DI,12H
MOVAL,0
MOV CX,10
AA: MOV [SI],AL
MOV [DI],AL
编写一个加法程序,在数据段偏移地址1000H处开始,存放有两个3字节长的数据(高位对应高地址,低位对应低地址),求这两数据(十六进制数)的和,并将结果放在两数据之后,利用DEBUG调试程序,并求解:CCBBAAH+223344H=?CCBBAA+554433H=?
程序如下:
DATA SEGMENT
ORG 1000H
MOV AX,DS ;使ES段地址与DS相同
MOV ES,AX
MOV SI,1000H
;不带最高位进位的全加器
MOV DI,1003H
MOV BX,1006H
MOV AL,[SI]
ADC AL,[DI]
MOV [BX],AL
PUSHF
;保护FR,这里其实没有必要,因为INC不会产生进位
MOVAL,0FFH
MOV DI,1000H
MOV CX,5 ;循环5次
LP1:MOV [DI],AL ;FF放入1000H-1004H中
INC DI
DEC CX
JNZ LP1
;==============================
RET
START ENDP
CODE ENDS
END STT
实验02A
PUSH AX
;==============================
MOV AX,DATA
MOV DS,AX
MOV SI,OFFSET H2
MOV AL,[SI]
MOV BX,OFFSET H1
XLAT
INC SI
MOV [SI],AL
;==============================
ERR DB 13,10,"The input number must be a HEX (0~F).",13,10,'$'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START PROC FAR
STT:PUSH DS
SUB AX,AX
PUSH AX
;==============================
INT 21H
ADD CL,30H ;ASCII码调整
MOV DL,CL ;打印结果中的个位
INT 21H
MOV AH,1 ;暂停
INT 21H
;==============================
RET
START ENDP
CODE ENDS
END STT
实验03A
在数据段偏移地址0100H处开始,存放0-9的平方值(构成一个表格),任给一个自然数M在0110H单元中(0<=M<=9),查表求出M的平方值,并将结果放入0111H单元。
INC SI
INC DI
INC BX
POPF
LOOPAA
MOV DL,0 ;最高位进位
ADC DL,0
MOV DI,1009H
MOV [DI],DL
MOV SI,1000H ;串传送
MOV DI,1010H
MOV CX,5
CLD
REP MOVSW ;一次传送一个字
;==============================
程序如下:
DATA SEGMENT
ORG 1000H
H1 DB 5 DUP(?)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START PROC FAR
STT:PUSH DS
SUB AX,AX
PUSH AX
;==============================
QUIT:CALL ESCAPE ;调用ESCAPE子程序
FINISH:
JMP BEGIN
;==============================
RET
START ENDP
ASCII2HEX PROC NEAR
CMP AL,30H ;ASCII转16进制子程序