題目來源:《微機原理與接口技術》第五版,周荷琴,中國科學技術大學出版社 第四章課後第10、11、12、13、17題
編程環境:DOSBOX 0.74 / masm611
博客編輯:Markdown (首次嘗試) (~ ̄▽ ̄)~
10.編寫彙編語言程序,完成如下功能:
(1) 從鍵盤輸入一個字符串“Please input a number: ”,存入BUFF開始的內存單元。
(2) 把內容中從BUFF單元開始存放的字符串顯示在屏幕上。
使用MOV對緩衝區偏移量配合INT 21的系統功能調用即可將字符串存入內存;
顯示字符串時有兩種方案:一種是在輸入字符串時在最後加“$”符號,在打印時會將它作爲結束標誌,相當於C語言字符串操作中‘\0’的作用;另一種方案是在存字符串入內存時同時把輸入的字符的數量存進去,顯示的時候把這個數字作爲循環次數一個一個把字符顯示出來。
;第一種方案
MYSTACK SEGMENT STACK
DW 64 DUP(?)
MYSTACK ENDS
DATA SEGMENT
BUFF DB 50
DB ?
DB 50 DUP(?)
DATA ENDS
ASSUME CS:CODE,SS:MYSTACK,CS:DATA
CODE SEGMENT
START: MOV AX, DATA
MOV DS, AX
MOV DX, OFFSET BUFF ;向緩衝區寫字符串
MOV AH, 0AH
INT 21H
MOV SI, OFFSET BUFF ;讀出緩衝區偏移地址
INC SI
MOV AH, 00H
MOV AL, [SI] ;輸入字符數存入AL
INC AL
INC AL
MOV SI, AX
MOV DS:[SI], '$' ;在字符串末存入'$'
MOV DX, OFFSET BUFF
INC DX
INC DX
MOV AH,9
INT 21H
INT 3H
MOV AX,4C00H
INT 21H
CODE ENDS
END START
;第二種方案
MYSTACK SEGMENT STACK
DW 64 DUP(?)
MYSTACK ENDS
DATA SEGMENT
BUFF DB 50
DB ?
DB 50 DUP(?)
DATA ENDS
ASSUME CS:CODE,SS:MYSTACK,CS:DATA
CODE SEGMENT
START: MOV AX, DATA
MOV DS, AX
MOV DX, OFFSET BUFF ;向緩衝區寫字符串
MOV AH, 0AH
INT 21H
MOV SI, OFFSET BUFF ;讀出緩衝區偏移地址
MOV CH, 00H
INC SI
MOV CL, [SI]
DIS: INC SI ;逐個循環顯示字符串內容
MOV DL, [SI]
MOV AH, 02H
INT 21H
LOOP DIS
INT 3H
MOV AX, 4C00H
INT 21H
CODE ENDS
END START
11.編程實現:在顯示器上顯示全部標準和擴展ASCII碼(其編碼爲00~FF)字符。
設定一個寄存器的值從00到FF循環,再依次顯示出來即可。
MYSTACK SEGMENT STACK
DW 64 DUP(?)
MYSTACK ENDS
DATA SEGMENT
DW ?
DATA ENDS
ASSUME DS:DATA,CS:CODE,SS:MYSTACK
CODE SEGMENT
START: MOV AX, DATA
MOV DS, AX
MOV CX, 0100H ;設定循環次數
MOV DH, 00 ;設定起始顯示字符對應ASCII碼
DIS: MOV DL, 00 ;每次顯示ASC前先顯示一個空格
MOV AH, 02H
INT 21H
MOV DL, DH
MOV AH, 02H
INT 21H
INC DH
LOOP DIS
INT 3
CODE ENDS
END START
12.編程實現:從鍵盤輸入一個10進制數字0~9,查表求鍵入數字的七段代碼,存入DL中,並在鍵入數字之前,顯示提示信息“Please input a number:”。
MYSTACK SEGMENT STACK
DW 64 DUP(?)
MYSTACK ENDS
DATA SEGMENT
TABLE DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
BUF DB ‘Please input a number(0~9):’,0DH,0AH,‘$’
DATA ENDS
ASSUME DS:DATA,CS:CODE,SS:MYSTACK
CODE SEGMENT
START: MOV AX, DATA
MOV DS, AX
MOV DX, OFFSET BUF
MOV AH, 09H
INT 21H ;顯示提示信息
MOV AH, 01H
INT 21H
MOV DL, AL ;由功能調用讀入字符並存入DL
AND DL, 0FH ;保證0~9
MOV BX, OFFSET TABLE ;BX指向表頭地址
MOV DH, 0 ;除最後一位均清零
ADD BX, DX
MOV DL, [BX] ;查表得平方值
INT 3
MOV AX, 4C00H
INT 21H
CODE ENDS
END START
更改部分代碼,使程序可以循環輸入,觀察DL,實現了題目要求
13.某個學生的英語成績已存放在BL中,如果低於60分,則顯示F(Fail),如果高於或等於85分,則顯示G(Good),否則顯示Pass(Pass),試編寫完整的彙編語言程序來實現。
對預存好的成績從小到大依次判斷,即先判斷和60分比較的大小,再判斷和85分比較的大小,這之間用好條件跳轉的命令即可。
這裏做一點小修改,我們將成績利用功能調用輸入到BL再判斷。
MYSTACK SEGMENT STACK
DW 64 DUP(?)
MYSTACK ENDS
DATA SEGMENT
DW ?
DATA ENDS
ASSUME CS:CODE,SS:MYSTACK,CS:DATA
CODE SEGMENT
START: MOV AX, DATA
MOV DS, AX ;數據段就位
MOV BL, 80 ;成績存放在BL中
CMP BL, 60
JB FAIL ;低於60分,跳轉到FAIL
CMP BL, 85
JAE GOOD ;不低於85分,跳轉到GOOD
MOV AL, 'P'
JMP PRINT
FAIL: MOV AL, 'F'
JMP PRINT
GOOD: MOV AL, 'G'
PRINT: MOV DL, AL
MOV AH, 02H
INT 21H
INT 3H
MOV AX, 4C00H
INT 21H
CODE ENDS
END START
通過在源代碼中修改BL的值得到三種結果。
17.已知數A=9876,數B=6543,編程求兩數之和。
分別將A和B以字的長度存儲在數據段開頭,在assume各段之後就可以直接相加,結果存儲在數據段中位於它們之後的位置,可用-D查看。
MYSTACK SEGMENT STACK
DW 64 DUP(?)
MYSTACK ENDS
DATA SEGMENT
XD DW 9876H
YD DW 6543H
ZD DW ?
DATA ENDS
ASSUME DS:DATA,CS:CODE,SS:MYSTACK
CODE SEGMENT
START: MOV AX, DATA
MOV DS, AX
MOV AX, XD
ADD AX, YD
MOV ZD, AX ;結果存儲到ZD中
INT 3
CODE ENDS
END START
如圖所示,-D可知,0000到0003存儲加數9876H,0004到0007存儲被加數6543H,0008到000B內是結果FD89H。