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

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號功能

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

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

  • 利用masm命令對源文件進(jìn)行匯編:輸入masm命令后連續(xù)回車4次危纫,此時匯編生成二進(jìn)制目標(biāo)文件hello,obj
  • 用link命令對生成的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)用乌庶。輸入一個“Hello world!” 輸出一個“hello world!”

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

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

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

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
  • 獲取對應(yīng)的光標(biāo)位置
  • int 10的3號功能為光標(biāo)位置透敌,會把行號存儲在dh,列號存儲在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

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

      ;行號存儲在dh中酗电,列號存儲在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)制計算結(jié)果-關(guān)鍵在溢出問題上

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

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

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

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

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

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   ;防止對數(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   ;這句話必須有,不然會出現(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ù)的時候是正常的划滋,但是當(dāng)結(jié)果是兩位數(shù)的時候,比如輸入 4 應(yīng)該輸出 11 个粱,但結(jié)果就開始亂了


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

image

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

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

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

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

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

由于非壓縮的BCD碼用一個字節(jié)表示一個十進(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)整為兩個非壓縮的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   ;防止對數(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表上表示的是同一個字符,但是 33可和33h不一樣了啊

image
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市灿椅,隨后出現(xiàn)的幾起案子套蒂,更是在濱河造成了極大的恐慌钞支,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件操刀,死亡現(xiàn)場離奇詭異烁挟,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)骨坑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進(jìn)店門撼嗓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人欢唾,你說我怎么就攤上這事静稻。” “怎么了匈辱?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵振湾,是天一觀的道長。 經(jīng)常有香客問我亡脸,道長押搪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任浅碾,我火速辦了婚禮大州,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘垂谢。我一直安慰自己厦画,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布滥朱。 她就那樣靜靜地躺著根暑,像睡著了一般。 火紅的嫁衣襯著肌膚如雪徙邻。 梳的紋絲不亂的頭發(fā)上排嫌,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天,我揣著相機(jī)與錄音缰犁,去河邊找鬼淳地。 笑死,一個胖子當(dāng)著我的面吹牛帅容,可吹牛的內(nèi)容都是我干的颇象。 我是一名探鬼主播,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼并徘,長吁一口氣:“原來是場噩夢啊……” “哼遣钳!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起饮亏,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤耍贾,失蹤者是張志新(化名)和其女友劉穎阅爽,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體荐开,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡付翁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了晃听。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片百侧。...
    茶點(diǎn)故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖能扒,靈堂內(nèi)的尸體忽然破棺而出佣渴,到底是詐尸還是另有隱情,我是刑警寧澤初斑,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布辛润,位于F島的核電站,受9級特大地震影響见秤,放射性物質(zhì)發(fā)生泄漏砂竖。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一鹃答、第九天 我趴在偏房一處隱蔽的房頂上張望乎澄。 院中可真熱鬧,春花似錦测摔、人聲如沸置济。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽浙于。三九已至,卻和暖如春查库,著一層夾襖步出監(jiān)牢的瞬間路媚,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工樊销, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人脏款。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓围苫,卻偏偏與公主長得像,于是被迫代替她去往敵國和親撤师。 傳聞我的和親對象是個殘疾皇子剂府,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內(nèi)容