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