組合語言子函式——將數字轉換為字串並顯示
阿新 • • 發佈:2019-02-13
對於機器來說,它是看不懂我們認為定義的數字的,必須要先轉換為人與機器的轉換協議,就是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 ret show_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 ret divdw: 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 ret code ends end start
這裡同樣用的是子函式的形式給出來的,主要的語句已經解釋了,需要學習者仔細看註釋,畢竟是組合語言,需要理解的部分很多,下面是執行結果:
程式中輸入的引數是197514,所以輸出是: