1. 程式人生 > 其它 >實驗6 鍵盤操作與顯示

實驗6 鍵盤操作與顯示

一、實驗目的
熟悉指令系統,掌握常用指令的用法;通過實驗加深對各種定址方式的理解;能熟練使用DEBUG中的命令對指令進行反彙編,觀察並瞭解機器程式碼。
二、實驗題

  1. 把資料段中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取有效地址其實作用一樣。

  1. 已知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
  1. 加法除錯


分析結果知: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
  1. 編寫程式,從鍵盤接收一個小寫字母,然後找出它的前導字元和後續字元,再按順序顯示這三個字元。把源程式附在下面,並把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.用截圖方式反應指令執行前後的相關暫存器或儲存單元內容的變化,並對所得結果進行分析。