匯編學(xué)習(xí)小記(二)-順序程序設(shè)計(jì)

20180411第二次實(shí)驗(yàn)總結(jié)

實(shí)驗(yàn)?zāi)康?/h1>

1.掌握非壓縮的BCD碼運(yùn)算及其調(diào)整辦法

2.掌握Dos功能調(diào)用int 21h的1,2,9,10號(hào)功能

3.掌握Bios功能調(diào)用int 10h的3號(hào)功能

1.寫一個(gè)簡(jiǎn)單的匯編語(yǔ)言程序,熟悉編譯鏈接調(diào)試過程

  • 利用masm命令對(duì)源文件進(jìn)行匯編:輸入masm命令后連續(xù)回車4次,此時(shí)匯編生成二進(jìn)制目標(biāo)文件hello,obj
  • 用link命令對(duì)生成的hello.obj進(jìn)行連接:輸入link命令后連續(xù)回車4次,連接后才能生成可執(zhí)行文件hello.exe
  • 執(zhí)行hello.exe文件
image
image

[注意??]
1.二進(jìn)制目標(biāo)文件obj結(jié)尾

2.Dos功能調(diào)用。輸入一個(gè)“Hello world!” 輸出一個(gè)“hello world!”

首先要把ds:dx數(shù)據(jù)段賦值為數(shù)據(jù)的地址

image
  • ah=10 字符串的輸入
  • 大寫轉(zhuǎn)換為小寫add al,20h
  • ah=9 字符串的輸出
image

但是如果想要全部都變?yōu)樾?,則需要使用循環(huán),不然就只能改變第一個(gè)的大小寫

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獲取光標(biāo)調(diào)用,將名字輸出到光標(biāo)處,選擇自己喜歡的彩色背景,彩色前景

  • 把es賦值為b800
  • 獲取對(duì)應(yīng)的光標(biāo)位置
  • int 10的3號(hào)功能為光標(biāo)位置,會(huì)把行號(hào)存儲(chǔ)在dh,列號(hào)存儲(chǔ)在dl中,然后顯示字符
image
image
image
葭葭葭葭葭葭葭  23:55:11
data segment
data ends

code segment
assume cs:code,ds:data

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

      ;獲取對(duì)應(yīng)的光標(biāo)位置(int 10的3號(hào)功能為光標(biāo)位置)
      mov bl,0
      mov ah,3
      mov bh,0
      int 10h

      ;行號(hào)存儲(chǔ)在dh中,列號(hào)存儲(chǔ)在dl中
      ;位置=dh*160+dl*2
      mov al,160

      ;將dh與al, 結(jié)果放在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.實(shí)現(xiàn)Y=2X+3,X是一位十進(jìn)制數(shù)。要求X從鍵盤輸入,在下一行上顯示“Y=2X+3=”以及十進(jìn)制計(jì)算結(jié)果-關(guān)鍵在溢出問題上

1.aam-非壓縮BCD碼乘法調(diào)整

區(qū)分舉例:十進(jìn)制數(shù) 9和15

  • 壓縮BCD
    • 一個(gè)字節(jié)表示兩位十進(jìn)制數(shù)
    • 9F
  • 非壓縮BCD碼
    • 一個(gè)字節(jié)表示一位十進(jìn)制數(shù)
    • 09 0F

實(shí)現(xiàn)Y=2X+3,X是一位十進(jìn)制數(shù)。要求X從鍵盤輸入,在下一行上顯示“Y=2X+3=”以及十進(jìn)制計(jì)算結(jié)果

解法一:我最開始的做法,但輸出超過兩位數(shù)就發(fā)生了錯(cuò)誤

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:
            ;   將數(shù)據(jù)端的段地址賦給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   ;防止對(duì)數(shù)據(jù)結(jié)果造成影響
            shl al,1   ;乘2后的結(jié)果就放在al中
            add al,3   ;加3
            mov bl,al  ;保存數(shù)據(jù)
            add bl,30h ;加上ASCII碼

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

            ;輸出結(jié)果
            mov ah,2   ;這句話必須有,不然會(huì)出現(xiàn)很多奇怪的圖片
            mov dl,bl
            int 21h
            
            mov ah,4ch
      int 21h
code ends
end start

實(shí)現(xiàn)效果:

image

解法二:運(yùn)用aam,結(jié)果是一位數(shù)的時(shí)候是正常的,但是當(dāng)結(jié)果是兩位數(shù)的時(shí)候,比如輸入 4 應(yīng)該輸出 11 ,但結(jié)果就開始亂了


實(shí)現(xiàn)效果:

image

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

     mess2 db 0ah,0dh,'Y=2x+3=$'

知識(shí)回顧學(xué)習(xí)

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

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

由于非壓縮的BCD碼用一個(gè)字節(jié)表示一個(gè)十進(jìn)制數(shù),調(diào)整后若加上30H 就是該數(shù)值的ASCII碼

image

所以AAA的含義為加法執(zhí)行后可以調(diào)整為ASCII

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

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

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

  • 將乘積調(diào)整為兩個(gè)非壓縮的BCD碼,商(高位)送AH,余數(shù)(低位)送入AL
image

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

image

解法三【正解】:aam+aaa

image
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:

            ;將數(shù)據(jù)端的段地址賦給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   ;防止對(duì)數(shù)據(jù)結(jié)果造成影響
            
            shl al,1   ;乘2后的結(jié)果就放在al中    
            aam
            
            add ax,3h      ;加3
            aaa
            
            
            add ax,3030h ;加上ASCII碼
            mov bx,ax    ;保存數(shù)據(jù)

            ;顯示“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

            ;輸出結(jié)果
            mov ah,2
            mov dl,bh
            int 21h
            mov dl,bl
            int 21h

            mov ah,4ch
      int 21h
code ends
end start

實(shí)現(xiàn)效果如下

image

本題總結(jié)

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

image
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容