[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
相關文章
- 組合語言實驗1—Debug基礎操作組合語言
- 組合語言組合語言
- 組合語言 1組合語言
- 組合語言 2組合語言
- C語言實驗——最值 (sdut oj)C語言
- 組合語言指令大全組合語言
- 組合語言-基礎功能組合語言
- 組合語言——更多功能組合語言
- 組合語言---判斷字元組合語言字元
- 組合語言入門教程組合語言
- windows10系統如何安裝語音體驗包並修改Windows顯示語言Windows
- win10如何輸入法顯示語言欄_讓win10輸入法顯示語言欄的步驟Win10
- 理解函數語言程式設計語言中的組合--前言(一)函數程式設計
- C語言實驗——素數 (sdut oj)C語言
- 用一條SQL語句顯示所有可能的比賽組合SQL
- 組合語言-基礎知識組合語言
- 8086執行組合語言組合語言
- 組合語言--單步中斷組合語言
- 組合語言學習筆記組合語言筆記
- 第二章--組合語言組合語言
- 組合語言的藝術(轉)組合語言
- ARM組合語言最常用指令組合語言
- 函數語言程式設計:Flutter&Dart中的組合函數程式設計FlutterDart
- C語言實驗——整數位 (sdut oj)C語言
- C語言實驗——分割整數 (sdut oj)C語言
- C語言預設引數值的實現C語言
- 組合語言-學習記錄(二)組合語言
- 基於MDK建立純組合語言--組合語言
- 組合語言的未來展望 (轉)組合語言
- Linux 組合語言開發指南Linux組合語言
- nand2tetris_hack組合語言NaN組合語言
- 【組合語言】第 3 章 暫存器(記憶體訪問)組合語言記憶體
- win10 如何顯示語言欄_win10語言欄隱藏了怎麼恢復Win10
- Jmeter中預設語言的顯示JMeter
- C語言直接顯示漢字(轉)C語言
- 1463: C語言實驗題――相加和最大值C語言
- JavaScript函數語言程式設計,真香之組合函式(二)JavaScript函數程式設計函式
- win10顯示的語言怎麼快速修改【圖文】Win10