微机原理上机实验答案
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
INC SI
DEC DI
INCAL
LOOPAA
;==============================
RET
START ENDP
CODE ENDS
END STT
实验03C,选作
在数据段偏移地址1000H处,安排部分七段LED显示码表,要求从键盘上任给一个0~F中的数,然后再屏幕上显示出其对应的码值。七段共阴极LED显示码表见实验册P14。
编写一个加法程序,在数据段偏移地址1000H处开始,存放有两个3字节长的数据(高位对应高地址,低位对应低地址),求这两数据(十六进制数)的和,并将结果放在两数据之后,利用DEBUG调试程序,并求解:CCBBAAH+223344H=?CCBBAA+554433H=?
程序如下:
DATA SEGMENT
ORG 1000H
实验01A
将FFFFH送到AX,BX,CX,DX,SI,DI,BP寄存器
程序如下:
CODE SEGMENT
ASSUME CS:CODE
START PROC FAR
STT:PUSH DS
SUB AX,AX
PUSH AX
;==============================
MOV AX,0FFFFH
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
;==============================
程序如下:
DATA SEGMENT
ORG 0100H
H1 DB 00,01,04,09,16,25,36,49,64,81
ORG 0110H
H2 DB 7,?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START PROC FAR
STT:PUSH DS
SUB AX,AX
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 ;一次传送一个字
;==============================
MOV BX,AX
MOV CX,AXHale Waihona Puke Baidu
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单元中
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单元。
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 ;保护输入
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
CMP CH,10 ;比较十位数结果是否大于10
JNC CC
MOV DL,0 ;打印十位不向百位进位的百位=0
INT 21H
JMP CCC
CC: MOV DL,31H ;打印十位向百位进位的百位=1
INT 21H
SUB CH,10
CCC:ADD CH,30H ;ASCII码调整
MOV DL,CH ;打印结果中的十位
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
MOV CL,4
SHR AL,CL
AND BL,0FH
CALL HEX2ASCII ;调用HEX2ASCII
CALL DISPLAY ;调用DISPLAY子程序
MOV AL,BL
CALL HEX2ASCII
CALL DISPLAY
MOV DL,72 ;打印字母"H"
MOV AH,2
INT 21H
JMP FINISH
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
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
程序如下:
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
;==============================
程序如下:
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,'$'
CMP AL,39H
JBE NUMBER ;如果AL<=9则跳至NUMBER
CMP AL,46H
JA ERROR ;如果AL>F则跳至ERROR
SUB AL,07H
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码个位加法
程序如下:
DATA SEGMENT
ORG 1000H
H1 DB 20 DUP(?)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START PROC FAR
STT:PUSH DS
SUB AX,AX
PUSH AX
;==============================
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
QUIT:CALL ESCAPE ;调用ESCAPE子程序
FINISH:
JMP BEGIN
;==============================
RET
START ENDP
ASCII2HEX PROC NEAR
CMP AL,30H ;ASCII转16进制子程序
JB ERROR ;如果AL<0则跳至ERROR
RET
START ENDP
CODE ENDS
END STT
实验02C,选作
编写一个两位十进制数加法程序,当从键盘上输入:n1n2+n3n4则在CRT上显示n1n2+n3n4=n5n6
程序如下:
DATA SEGMENT
H1 DB "The addends all must be two figures, insufficient adds 0 in front.",13,10,'$'
MOV [SI],AL
CMP AL,27 ;如果按下<ESC>键,跳至QUIT
JZ QUIT
CALL DISPLAY0 ;调用DISPLAY0子程序
CALL ASCII2HEX ;调用ASCII2HEX子程序
CMP AL,0FFH ;如果AL不等于FF(出错码)则跳至CORRECT
JNZ CORRECT
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
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START PROC FAR
STT:PUSH DS
SUB AX,AX
PUSH AX
;==============================
MOV AX,DATA
MOV DS,AX
LEA DX,H1 ;打印注释:加数和被加数都必须为两位数,不够的前面补0
ADC DL,0
MOV DI,1009H
MOV [DI],DL
;==============================
RET
START ENDP
CODE ENDS
END STT
实验02B
用串传送指令把A程序的数据块(被加数、加数、和)偏移地址1000H开始的区域传递到同一数据段的偏移地址为1010H开始的区域,并利用DEBUG查看运行结果
MOV AX,DS ;使ES段地址与DS相同
MOV ES,AX
MOV SI,1000H
;不带最高位进位的全加器
MOV DI,1003H
MOV BX,1006H
MOV CX,3
CLC
AA: MOV AL,[SI]
ADC AL,[DI]
MOV [BX],AL
PUSHF
;保护FR,这里其实没有必要,因为INC不会产生进位
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码调整
;不带最高位进位的全加器
MOV DI,1003H
MOV BX,1006H
MOV CX,3
CLC
AA: MOV AL,[SI]
ADC AL,[DI]
MOV [BX],AL
PUSHF
;保护FR,这里其实没有必要,因为INC不会产生进位
INC SI
INC DI
INC BX
POPF
LOOPAA
MOV DL,0 ;最高位进位
DEC DI
INCAL
LOOPAA
;==============================
RET
START ENDP
CODE ENDS
END STT
实验03C,选作
在数据段偏移地址1000H处,安排部分七段LED显示码表,要求从键盘上任给一个0~F中的数,然后再屏幕上显示出其对应的码值。七段共阴极LED显示码表见实验册P14。
编写一个加法程序,在数据段偏移地址1000H处开始,存放有两个3字节长的数据(高位对应高地址,低位对应低地址),求这两数据(十六进制数)的和,并将结果放在两数据之后,利用DEBUG调试程序,并求解:CCBBAAH+223344H=?CCBBAA+554433H=?
程序如下:
DATA SEGMENT
ORG 1000H
实验01A
将FFFFH送到AX,BX,CX,DX,SI,DI,BP寄存器
程序如下:
CODE SEGMENT
ASSUME CS:CODE
START PROC FAR
STT:PUSH DS
SUB AX,AX
PUSH AX
;==============================
MOV AX,0FFFFH
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
;==============================
程序如下:
DATA SEGMENT
ORG 0100H
H1 DB 00,01,04,09,16,25,36,49,64,81
ORG 0110H
H2 DB 7,?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START PROC FAR
STT:PUSH DS
SUB AX,AX
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 ;一次传送一个字
;==============================
MOV BX,AX
MOV CX,AXHale Waihona Puke Baidu
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单元中
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单元。
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 ;保护输入
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
CMP CH,10 ;比较十位数结果是否大于10
JNC CC
MOV DL,0 ;打印十位不向百位进位的百位=0
INT 21H
JMP CCC
CC: MOV DL,31H ;打印十位向百位进位的百位=1
INT 21H
SUB CH,10
CCC:ADD CH,30H ;ASCII码调整
MOV DL,CH ;打印结果中的十位
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
MOV CL,4
SHR AL,CL
AND BL,0FH
CALL HEX2ASCII ;调用HEX2ASCII
CALL DISPLAY ;调用DISPLAY子程序
MOV AL,BL
CALL HEX2ASCII
CALL DISPLAY
MOV DL,72 ;打印字母"H"
MOV AH,2
INT 21H
JMP FINISH
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
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
程序如下:
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
;==============================
程序如下:
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,'$'
CMP AL,39H
JBE NUMBER ;如果AL<=9则跳至NUMBER
CMP AL,46H
JA ERROR ;如果AL>F则跳至ERROR
SUB AL,07H
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码个位加法
程序如下:
DATA SEGMENT
ORG 1000H
H1 DB 20 DUP(?)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START PROC FAR
STT:PUSH DS
SUB AX,AX
PUSH AX
;==============================
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
QUIT:CALL ESCAPE ;调用ESCAPE子程序
FINISH:
JMP BEGIN
;==============================
RET
START ENDP
ASCII2HEX PROC NEAR
CMP AL,30H ;ASCII转16进制子程序
JB ERROR ;如果AL<0则跳至ERROR
RET
START ENDP
CODE ENDS
END STT
实验02C,选作
编写一个两位十进制数加法程序,当从键盘上输入:n1n2+n3n4则在CRT上显示n1n2+n3n4=n5n6
程序如下:
DATA SEGMENT
H1 DB "The addends all must be two figures, insufficient adds 0 in front.",13,10,'$'
MOV [SI],AL
CMP AL,27 ;如果按下<ESC>键,跳至QUIT
JZ QUIT
CALL DISPLAY0 ;调用DISPLAY0子程序
CALL ASCII2HEX ;调用ASCII2HEX子程序
CMP AL,0FFH ;如果AL不等于FF(出错码)则跳至CORRECT
JNZ CORRECT
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
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START PROC FAR
STT:PUSH DS
SUB AX,AX
PUSH AX
;==============================
MOV AX,DATA
MOV DS,AX
LEA DX,H1 ;打印注释:加数和被加数都必须为两位数,不够的前面补0
ADC DL,0
MOV DI,1009H
MOV [DI],DL
;==============================
RET
START ENDP
CODE ENDS
END STT
实验02B
用串传送指令把A程序的数据块(被加数、加数、和)偏移地址1000H开始的区域传递到同一数据段的偏移地址为1010H开始的区域,并利用DEBUG查看运行结果
MOV AX,DS ;使ES段地址与DS相同
MOV ES,AX
MOV SI,1000H
;不带最高位进位的全加器
MOV DI,1003H
MOV BX,1006H
MOV CX,3
CLC
AA: MOV AL,[SI]
ADC AL,[DI]
MOV [BX],AL
PUSHF
;保护FR,这里其实没有必要,因为INC不会产生进位
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码调整
;不带最高位进位的全加器
MOV DI,1003H
MOV BX,1006H
MOV CX,3
CLC
AA: MOV AL,[SI]
ADC AL,[DI]
MOV [BX],AL
PUSHF
;保护FR,这里其实没有必要,因为INC不会产生进位
INC SI
INC DI
INC BX
POPF
LOOPAA
MOV DL,0 ;最高位进位