彙編學習小記(二)-順序程式設計

Ajiajiajia發表於2018-04-19

20180411第二次實驗總結

實驗目的

1.掌握非壓縮的BCD碼運算及其調整辦法

2.掌握Dos功能呼叫int 21h的1,2,9,10號功能

3.掌握Bios功能呼叫int 10h的3號功能

1.寫一個簡單的組合語言程式,熟悉編譯連結除錯過程

  • 利用masm命令對原始檔進行彙編:輸入masm命令後連續回車4次,此時彙編生成二進位制目標檔案hello,obj
  • 用link命令對生成的hello.obj進行連線:輸入link命令後連續回車4次,連線後才能生成可執行檔案hello.exe
  • 執行hello.exe檔案

彙編學習小記(二)-順序程式設計

彙編學習小記(二)-順序程式設計

[注意⚠️] 1.二進位制目標檔案obj結尾

2.Dos功能呼叫。輸入一個“Hello world!” 輸出一個“hello world!”

首先要把ds:dx資料段賦值為資料的地址

彙編學習小記(二)-順序程式設計

  • ah=10 字串的輸入
  • 大寫轉換為小寫add al,20h
  • ah=9 字串的輸出

彙編學習小記(二)-順序程式設計

但是如果想要全部都變為小寫,則需要使用迴圈,不然就只能改變第一個的大小寫

data segment
     buffer db 20,?,21 dup('$')
data ends

code segment
     assume cs:code,ds:data
     start:
     mov ax,seg buffer
     mov ds,ax
     mov dx,offset buffer
     mov ah,10
     int 21h


     mov buffer[0],0dh
     mov buffer[1],0ah
     mov ax,seg buffer
     mov ds,ax
     mov dx,offset buffer
     mov ah,9
     int 21h

     mov ah,4ch
     int 21h
code ends
end start
複製程式碼

3.bios獲取游標呼叫,將名字輸出到游標處,選擇自己喜歡的彩色背景,彩色前景

  • 把es賦值為b800
  • 獲取對應的游標位置
  • int 10的3號功能為游標位置,會把行號儲存在dh,列號儲存在dl中,然後顯示字元

彙編學習小記(二)-順序程式設計

彙編學習小記(二)-順序程式設計

彙編學習小記(二)-順序程式設計

葭葭葭葭葭葭葭  23:55:11
data segment
data ends

code segment
assume cs:code,ds:data

			start:
			;把es賦值為b800
			mov ax,0b800h
			mov es,ax

      ;獲取對應的游標位置(int 10的3號功能為游標位置)
      mov bl,0
      mov ah,3
      mov bh,0
      int 10h

      ;行號儲存在dh中,列號儲存在dl中
      ;位置=dh*160+dl*2
      mov al,160

      ;將dh與al, 結果放在ax
      mul dh

      mov dh,0
      shl dl,1
      add ax,bx
      mov bx,ax

      ;打出 Ajiajia
      mov al,41h
      mov es:[bx+0],al
      mov byte ptr es:[bx+1],1eh

      mov al,6Ah
      mov es:[bx+2],al
      mov byte ptr es:[bx+3],1eh

      mov al,69h
      mov es:[bx+4],al
      mov byte ptr es:[bx+5],1eh

      mov al,61h
      mov es:[bx+6],al
      mov byte ptr es:[bx+7],1eh

      mov al,6Ah
      mov es:[bx+8],al
      mov byte ptr es:[bx+9],1eh

      mov al,69h
      mov es:[bx+10],al
      mov byte ptr es:[bx+11],1eh

      mov al,61h
      mov es:[bx+12],al
      mov byte ptr es:[bx+13],1eh
code ends
end start
複製程式碼

4.實現Y=2X+3,X是一位十進位制數。要求X從鍵盤輸入,在下一行上顯示“Y=2X+3=”以及十進位制計算結果-關鍵在溢位問題上

1.aam-非壓縮BCD碼乘法調整

區分舉例:十進位制數 9和15

  • 壓縮BCD
    • 一個位元組表示兩位十進位制數
    • 9F
  • 非壓縮BCD碼
    • 一個位元組表示一位十進位制數
    • 09 0F

實現Y=2X+3,X是一位十進位制數。要求X從鍵盤輸入,在下一行上顯示“Y=2X+3=”以及十進位制計算結果

解法一:我最開始的做法,但輸出超過兩位數就發生了錯誤

data segment
			mess db 'Y=2X+3,Please Input X : $'
			show db 'Y=2X+3= $'
data ends

code segment
assume cs:code,ds:data
			start:
			;	將資料端的段地址賦給ds
			mov ax,data
			mov ds,ax

			;提示資訊的顯示
			mov dx,offset mess
			mov ah,9
			int 21h

			;鍵盤輸入 輸入後的值放在al中
			mov ah,1
			int 21h
			sub al,30h ;去掉ASCII碼
			mov ah,0   ;防止對資料結果造成影響
			shl al,1   ;乘2後的結果就放在al中
			add al,3   ;加3
			mov bl,al  ;儲存資料
			add bl,30h ;加上ASCII碼

			;顯示“Y=2X+3=”,在此之前加入回車換行
			mov ah,2
			mov dl,0ah
			int 21h    ;換行
			mov dx,offset show
			mov ah,9
			int 21h

			;輸出結果
			mov ah,2   ;這句話必須有,不然會出現很多奇怪的圖片
			mov dl,bl
			int 21h
			
			mov ah,4ch
      int 21h
code ends
end start
複製程式碼

實現效果:

彙編學習小記(二)-順序程式設計

解法二:運用aam,結果是一位數的時候是正常的,但是當結果是兩位數的時候,比如輸入 4 應該輸出 11 ,但結果就開始亂了


複製程式碼

實現效果:

彙編學習小記(二)-順序程式設計

【注意⚠️】輸出提示之前自己帶上回車和空行

 	 mess2 db 0ah,0dh,'Y=2x+3=$'
複製程式碼

知識回顧學習

1.非壓縮BCD碼的加法-AAA

  • 如果AL的低四位大於9,將AL加6,AH加1,AL的高四位清零,CF與AF置1

由於非壓縮的BCD碼用一個位元組表示一個十進位制數,調整後若加上30H 就是該數值的ASCII碼

彙編學習小記(二)-順序程式設計

所以AAA的含義為加法執行後可以調整為ASCII

2.非壓縮BCD碼的減法-AAS

  • 如果輔助進位AF為1(AC),將AL減6,AH減1,AL的高四位清零,CF置1

彙編學習小記(二)-順序程式設計

3.非壓縮BCD碼的乘法-AAM

  • 將乘積調整為兩個非壓縮的BCD碼,商(高位)送AH,餘數(低位)送入AL

彙編學習小記(二)-順序程式設計

4.非壓縮BCD碼的除法-AAD

彙編學習小記(二)-順序程式設計

解法三【正解】:aam+aaa

彙編學習小記(二)-順序程式設計

data segment
			mess db 'Y=2X+3,Please Input X : $'
			show db 'Y=2X+3= $'
data ends

code segment
assume cs:code,ds:data
			start:

			;將資料端的段地址賦給ds
			mov ax,data
			mov ds,ax

			;提示資訊的顯示
			mov dx,offset mess
			mov ah,9
			int 21h
			;鍵盤輸入 輸入後的值放在al中
			mov ah,1
			int 21h
			sub al,30h ;去掉ASCII碼
			
			mov ah,0   ;防止對資料結果造成影響
			
			shl al,1   ;乘2後的結果就放在al中	
			aam
			
			add ax,3h	   ;加3
			aaa
			
			
			add ax,3030h ;加上ASCII碼
			mov bx,ax    ;儲存資料

			;顯示“Y=2X+3=”,在此之前加入回車換行
			mov ah,2
			mov dl,0dh	;回車
			int 21h
			mov dl,0ah
			int 21h     ;換行
			mov dx,offset show
			mov ah,9
			int 21h

			;輸出結果
			mov ah,2
			mov dl,bh
			int 21h
			mov dl,bl
			int 21h

			mov ah,4ch
      int 21h
code ends
end start
複製程式碼

實現效果如下

彙編學習小記(二)-順序程式設計

本題總結

1.如果要寫十六進位制的,就需要帶著H。這裡的加3,寫為 add ax,3h 可行,寫為 add ax,3 仍舊可行的原因是 :3和3h在ascii表上表示的是同一個字元,但是 33可和33h不一樣了啊

彙編學習小記(二)-順序程式設計

相關文章