實驗6 鍵盤操作與顯示
阿新 • • 發佈:2022-05-21
一、實驗目的
熟悉指令系統,掌握常用指令的用法;通過實驗加深對各種定址方式的理解;能熟練使用DEBUG中的命令對指令進行反彙編,觀察並瞭解機器程式碼。
二、實驗題
- 把資料段中1維陣列AA_1變數地址中連續7個數(1,3,5,7,2,4,6)讀出,把每個數加2後再存入到資料段中BB_1陣列開始的標號地址中去,並顯示出BB_1陣列中每個數來(之間用空格分開),參考程式如下:
DATA SEGMENT ORG 0100H AA_1 DB 1,3,5,7,2,4,6 ORG 0150H BB_1 DB SUB(?) COUNT DW 7 DATA ENDS CSEG SEGMENT ASSUME CS: CSEG,DS:DATA START:MOV AX, DATA MOV DS, AX MOV CX, COUNT LEA SI, AA_1 LEA DI, BB_1 LP1: MOV AL, [SI] ADD AL,2 MOV [DI], AL INC SI INC DI LOOP LP1 LEA SI, BB_1 MOV CX, COUNT DISP: MOV DL, [SI] ADD DL, 30H ;因為顯示不能直接顯示數值,所以要轉換成對應的ascii碼 MOV AH,02 INT 21H MOV DL,‘ ’ MOV AH,2 INT 21H INC SI LOOP DISP MOV AH,4CH INT 21H CSEG ENDS END START
請回答以下問題:
(1) 指令MOV AH, 02H中02H的含義是?
INT 21H 是DOS功能呼叫,呼叫的功能號都放在AH中,MOV AH,02H就是呼叫螢幕字元顯示功能,其實就和MOV AH,4CH一樣只不過4CH呼叫的是程式結束執行的功能。
(2) 指令ADD DL, 30H的作用是什麼?
因為我們要在螢幕上顯示字元,但是螢幕顯示字元不能直接顯示字元,所以我們需要先將DL中的數值加上30H轉換成ASCII碼值然後才能正確顯示對應的數值字元。
(3) 除了參考程式中用的訪問方式,還可以用什麼方式訪問AA_1數組裡的元素?
組合語言中訪問陣列其實和C語言十分類似,段地址+偏移地址=真實地址,就和C語言通過陣列名加序號的方式訪問差不多。
除了通過LEA來獲取陣列的有效地址之外,還可以通過mov offset來獲取陣列的偏移地址,這和LEA取有效地址其實作用一樣。
- 已知DATAX和DATAY單元各存放一個帶符號位元組資料,從鍵盤上接收加(+)、減(-)、乘(*)或除(/)符號,然後完成相應運算,結果存入RLT單元。
DATAS SEGMENT DATAX DB 9H DATAY DB 3H RLT DB ? DATAS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS START: mov ax,DATAS mov ds,ax mov ah,1h int 21h ;進行中斷輸入 CMP AL,'+' JZ JIAFA CMP AL,'-' JZ JIANFA CMP AL,'*' JZ CHENGFA MOV AL,DATAX CBW IDIV DATAY MOV WORD PTR RLT,AX;AX包含商和餘數 JMP EXIT JIAFA: MOV AL,DATAX ADD AL,DATAY MOV RLT,AL JMP EXIT JIANFA: MOV AL,DATAX SUB AL,DATAY MOV RLT,AL JMP EXIT CHENGFA: MOV AL,DATAX IMUL DATAY mov WORD PTR RLT,AX EXIT: MOV AH,4CH INT 21H CODES ENDS END START
- 加法除錯
分析結果知:9+3的結果是12,換算成16進位制也就是0CH
2. 減法除錯
分析結果知:9-3的結果為6.
3. 乘法除錯
分析結果:3*9=27,換算成16進位制也就是1BH
4. 除法除錯
分析可知:9除以3等於3.
總結:考慮到演算法的魯棒性,我認為應該判斷輸入除法符號,否則除了加減乘其他的都會被視為除法運算子號
DATAS SEGMENT
DATAX DB 9H
DATAY DB 3H
RLT DB ?
DATAS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS
START:
mov ax,DATAS
mov ds,ax
mov ah,1h
int 21h ;進行中斷輸入
CMP AL,'+'
JZ JIAFA
CMP AL,'-'
JZ JIANFA
CMP AL,'*'
JZ CHENGFA
CMP AL,'/'
JZ CHUFA
JIAFA:
MOV AL,DATAX
ADD AL,DATAY
MOV RLT,AL
JMP EXIT
JIANFA:
MOV AL,DATAX
SUB AL,DATAY
MOV RLT,AL
JMP EXIT
CHENGFA:
MOV AL,DATAX
IMUL DATAY
MOV WORD PTR RLT,AX
JMP EXIT
CHUFA:
MOV AL,DATAX
CBW
IDIV DATAY
MOV WORD PTR RLT,AX;AX包含商和餘數
EXIT:
MOV AH,4CH
INT 21H
CODES ENDS
END START
- 編寫程式,從鍵盤接收一個小寫字母,然後找出它的前導字元和後續字元,再按順序顯示這三個字元。把源程式附在下面,並把debug單步除錯的截圖附在下面。
DATAS SEGMENT
DATAX DB ?
DATAY DB ?
DATAZ DB ?
DATAS ENDS
STACKS SEGMENT STACK
DW 1024 DUP(?)
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
mov ax,DATAS
mov ds,ax
mov ah,1h
int 21h ;進行中斷輸入
MOV DATAY,AL
SUB AL,1
MOV DATAX,AL
ADD AL,2
MOV DATAZ,AL
MOV DL,0dh
MOV AH,2
INT 21H
MOV DL,0ah
MOV AH,2
INT 21H
MOV DL,DATAX
MOV AH,2
INT 21H
MOV DL,' '
MOV AH,2
INT 21H
MOV DL,DATAY
MOV AH,2
INT 21H
MOV DL,' '
MOV AH,2
INT 21H
MOV DL,DATAZ
MOV AH,2
INT 21H
MOV DL,' '
MOV AH,2
INT 21H
MOV AH,4CH
INT 21H
CODES ENDS
END START
分析:可以發現除錯結果datax,datay,dataz三個值分別是a,b,c的ascii碼值。
三 實驗報告
要求: 1.每步操作過程及所用指令;2.用截圖方式反應指令執行前後的相關暫存器或儲存單元內容的變化,並對所得結果進行分析。