[048][組合語言]實驗10 3、數值顯示
3、數值顯示
- 程式設計,將資料12666以十進位制形式在螢幕的8行3列,用綠色顯示出來。在顯示時我們呼叫本次實驗中的第一個子程式show_str
實際執行
完整原始碼
assume cs:code
data segment
db 10 dup (0)
data ends
stack segment
db 10 dup (0)
stack ends
code segment
start: mov ax,12666
mov bx,data
mov ds,bx
mov si,0
call dtoc
mov dh,9
mov dl,3
mov cl,2
call show_str
mov ax,4c00H
int 21H
dtoc: push ax
push bx
push cx
push dx
push ds
push si
push ss
mov dx,0
mov bx,0AH
s0: mov cx,ax
jcxz ok0
div bx
add dx,30H
mov ds:[si],dx
mov dx,0
inc si
jmp short s0
ok0: mov bx,stack
mov ss,bx
mov bx,si
mov cx,si
mov si,0
s1: push ds:[si]
inc si
loop s1
mov cx,bx
mov si,0
s2: pop ds:[si]
inc si
loop s2
mov bx,0
mov ds:[si],bx
mov si,bx
pop ss
pop si
pop ds
pop dx
pop cx
pop bx
pop ax
ret
show_str: push ax
push es
push dx
push bx
push cx
push si
push di
mov ax,0b800h
mov es,ax
dec dh
mov al,160
mul dh
mov bx,ax
mov al,2
mul dl
add bx,ax
mov dl,cl
mov di,0
show: mov cl,[si]
mov ch,0
jcxz ok
mov es:[bx+di],cl
mov es:[bx+di+1],dl
inc si
add di,2
jmp short show
ok: pop di
pop si
pop cx
pop bx
pop dx
pop es
pop ax
ret
code ends
end start
程式碼說明
十進位制碼字元對應的ASCII碼 = 十進位制數碼值 + 30H
- 12666 是什麼?
十進位制 12666D
十進位制對應的ASCII碼 31H 32H 36H 36H 36H
十六進位制 317AH (使用16位可以表示)
二進位制 0011 0001 0111 1010B
顯示到螢幕 上要在 【視訊記憶體】 填入 【ASCII碼的值】
要在螢幕上以【十進位制形式】顯示字串
要在【視訊記憶體】填入 【十進位制對應的ASCII碼 31H 32H 36H 36H 36H 】
子程式描述裡提示我們,字串以0結尾符
對應程式碼裡的
mov bx,0
mov ds:[si],bx
- 如何得到每位的值?
被除數/除數=商...餘數
12666 / 10 = 1266...6
1266/10 = 126...6
126/10 = 12...6
12/10 = 1..6
1/10 = 0...1
從餘數得到每位的值
對應程式碼
add dx,30H
mov ds:[si],dx
商為0,作為迴圈終止的判斷條件
對應程式碼
mov cx,ax
jcxz ok0
因為不知道具體的被除數有多少位,
所以只能通過jcxz來進行除法迴圈。
因為得到的餘數依次是6 6 6 2 1,是逆序的,
所以,用一個棧,將其順序反過來,變成1 2 6 6 6
具體過程就是 6 6 6 2 1 依次進棧,
再按照 1 2 6 6 6的順序依次出棧,直接寫入data段。
- 使用哪種形式的除法?
直接使用 32位 ÷ 16位 形式的除法
除數 10D = 0AH 被放入16位暫存器 BX
被除數使用 DX(高16位)以及AX(低16位)來表示
餘數和商被放入 DX (餘數)以及 AX(商)
本題中 12666D 本質是 317AH
雖然只用16位暫存器來表示就可以,
但是本題的資料使用16位÷8位的形式會產生溢位,
因此需要使用 32位 ÷ 16位 的形式,
需要將 317AH 擴充套件成 0000 317AH
程式碼參考
- show_str 子程式 直接複製於 實驗10 1、顯示字串
- 除法指令 div https://www.jianshu.com/p/211cf4edd4d3
相關文章
- 組合語言-實驗10編寫子程式組合語言
- 組合語言實驗1—Debug基礎操作組合語言
- 讀書筆記:組合語言(王爽)實驗七筆記組合語言
- 組合語言1 - 什麼是組合語言?組合語言
- 組合語言組合語言
- 11.5實驗10:組合模式模式
- 組合語言 1組合語言
- 組合語言 2組合語言
- 組合語言-棧組合語言
- windows10系統如何安裝語音體驗包並修改Windows顯示語言Windows
- win10如何輸入法顯示語言欄_讓win10輸入法顯示語言欄的步驟Win10
- <組合語言> 5. [BX] 和 loop | 實驗 4 : [BX] 和 loop 的使用組合語言OOP
- Go 語言的組合之道Go
- 組合語言---判斷字元組合語言字元
- 組合語言——更多功能組合語言
- 組合語言-基礎功能組合語言
- 8086執行組合語言組合語言
- Python 設定Admin顯示語言Python
- VSCode設定中文語言顯示VSCode
- win10 如何顯示語言欄_win10語言欄隱藏了怎麼恢復Win10
- 理解函數語言程式設計語言中的組合--前言(一)函數程式設計
- 用一條SQL語句顯示所有可能的比賽組合SQL
- 【數值計算方法】線性方程組的迭代解法-數值實驗
- 組合語言--單步中斷組合語言
- 組合語言-CALL和RET指令組合語言
- 組合語言-基礎知識組合語言
- win10安裝語言包後沒有顯示怎麼處理_win10安裝語言包後沒有顯示解決方法Win10
- Jmeter中預設語言的顯示JMeter
- windows10不顯示語言欄怎麼辦_win10還原語言欄的解決方法WindowsWin10
- win10 1909桌面語言欄不顯示怎麼辦_win10 1909工作列右下角不顯示語言欄解決教程Win10
- # 2020-10-12 #「組合語言 第 3 版 王爽」- 參考答案:實驗 17 編寫包含多個功能子程式的中斷例程組合語言
- 函數語言程式設計:Flutter&Dart中的組合函數程式設計FlutterDart
- # 2020-10-11 #「組合語言 第 3 版 王爽」- 參考答案:檢測點 11.4組合語言
- C語言實驗二C語言
- C語言實驗1C語言
- nand2tetris_hack組合語言NaN組合語言
- 組合語言-學習記錄(二)組合語言
- lec 02 arm組合語言基礎組合語言