組合語言子函式 將數字轉換為字串並顯示

2021-06-28 01:55:41 字數 3339 閱讀 3142

對於機器來說,它是看不懂我們認為定義的數字的,必須要先轉換為人與機器的轉換協議,就是ascii碼,所以需要先轉換再顯示

這裡將用到之前兩節中用到的子函式

**如下:

assume cs:code, ds:data

data segment

db 10 dup(0)

dd 197514

data ends

code segment

start: mov bx, data

mov ds, bx

mov ax, ds:[10]

mov dx, ds:[12]

mov si, 0

call dtoc

mov dh, 8

mov dl, 3

mov cl, 2

call show_str

mov ax, 4c00h

int 21h

dtoc: push sp

push ds

push es

push bx

push cx

push bp

push si

push di

push dx

push ax

mov bp, sp ;[bp]是ax, [bp+2]是dx

mov di, 0

mov bx, [bp] ;將要顯示的數值的低位取出

mov si, [bp + 2] ;將要顯示的數值的高位取出

s1: mov ax, bx ;呼叫之前寫的子函式防止溢位問題

mov dx, si ;這裡的ax和dx分別存放資料的低位和高位

mov cx, 10 ;cx存放除數

call divdw

add cl, 30h ;處理後cx得到餘數

mov ch, 0

push cx ;在該迴圈中,push操作只進行了兩次,因為當餘數為最後乙個的時候,商已經變為零

add di, 1 ;如果是兩位數,di加了兩次

mov bx, ax ;將得到的商的低位送入bx,進行迴圈

mov si, dx ;將得到的商的高位送入si,進行迴圈

mov cx, ax ;ax中存放的是商的低位, 當商的低位為零時結束迴圈

jcxz ok1

jmp s1

ok1: mov si, 0

mov cx, di

s2: pop bx ;出棧兩次

mov ds:[si], bl

add si, 1 ;;;;;;;;;;;;;;;;;;;;;;;

loop s2

mov bl, 0h

mov ds:[si], bl

pop ax

pop dx

pop di

pop si

pop bp

pop cx

pop bx

pop es

pop ds

pop sp

retshow_str: push ax

push cx

push si

push di

push bx

push es

push dx ;用棧將行數和列數儲存起來

mov bp, sp

mov al, [bp + 1]

mov ah, 0

mov bx, 160

mul bx

mov si, ax ;做了16位乘法演算法後,dx的值已經被改變

;si中存放顯示區域的每行的首偏移位址

mov al, [bp] ;因為每個字元是用由兩個位元組組成的,所以這裡計算列數

mov bl, 2

mul bl

mov bx, ax ;bx中存放每個字元的第乙個位元組的位址

pop dx ;將上次入棧的dx出棧

mov di, 0

mov dl, cl ;將顏色資訊給dl

mov ax, 0b800h

mov es, ax

s: mov cl, ds:[di]

mov ch, 0

jcxz ok

mov es:[si + bx], cl

mov es:[si + bx + 1], dl

add bx, 2

add di, 1

jmp s

ok: pop es

pop bx

pop di

pop si

pop cx

pop ax

retdivdw: push si

push di

push ax

push dx

push cx

mov bp, sp ;[bp]是cx,[bp+2]是dx,[bp+4]是ax

mov ax, [bp + 2] ;ax存放16位除法的低位

mov dx, 0

mov bx, [bp]

div bx

mov si, ax ;si存放商

mov ax, [bp + 4]

mov bx, [bp]

div bx

mov cx, dx

mov dx, si

pop di

pop di

pop di

pop di

pop si

retcode ends

end start

這裡同樣用的是子函式的形式給出來的,主要的語句已經解釋了,需要學習者仔細看注釋,畢竟是組合語言,需要理解的部分很多,下面是執行結果:

程式中輸入的引數是197514,所以輸出是:

將數字轉換為字串

在日常程式設計中,我們經常需要將各型別的數字轉換為字串,這裡介紹幾種簡單方法。本文沒有介紹轉換的具體演算法。1.使用巨集轉換常量數字為字串 定義如下的巨集 define to string x x 則在 中就可以將各種型別的數字轉換為字串。這個巨集可以將任意的 中的字串轉換為c語言風格的字串 例 t...

將數字字串轉換為數字

將數字字串轉換為數字的方法有多種,c中有atoi,atof,sscanf函式可用,這些函式的用法可以在msdn里查到,這裡就不在多說了,現在說一種通用的轉換的方法 template bool str2value const std string str,type value,std ios base...

將字元數字轉換為數字輸出(模擬atoi)

例如 12345 轉換成12345 我們所所遇到的字串可能有以下幾種情況 include include include enum state state state invalid int my atoi char str while isspace str 跳過字元前面的空格 if str el...