《微機原理與接口技術》上一些8086彙編程序

題目來源:《微機原理與接口技術》第五版,周荷琴,中國科學技術大學出版社 第四章課後第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

使用-t命令單步執行到輸入字符串的位置後再使用-g命令直接運行完畢到顯示

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

-G後-D
如圖所示,-D可知,0000到0003存儲加數9876H,0004到0007存儲被加數6543H,0008到000B內是結果FD89H。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章