十进制数据显示
昨晚快做完的时候,快要断电了,结果不得不赶紧关机我这个没有电池的伪笔记本,现在终于完成通过调试了,这里面用到了三个子程序,这么长长的一大篇近百行源码实现的功能却简单的令人发指:以十进制方式将ax中的数据显示在屏幕上。
不过,这对于了解电脑内部的工作原理是非常有用的。以前学的半吊子硬件基础对现在的汇编学习也起了不小帮助。
网工看的一踏糊涂,法语课上的直想呕吐(一个单词tmd十几个变位),还是汇编好。
某些老师上课烂还可以原谅,但还爱点名就是你们的不对了。
五一到了,明天去野人谷。
assume cs:code,ds:data,ss:stack
data segment
db 10 dup (0)
data ends ;存放转化为ascii码的数字
stack segment
dw 16 dup (0)
stack ends ;定义栈
code segment
start: mov ax,12666
mov bx,data
mov ds,bx
mov bx,stack
mov ss,bx
mov sp,32
mov si,0
call dtoc ;第一个子程序,将word型数据转换为十进制字符串
mov dh,8
mov dl,3
mov cl,2
call show_str ;第二个子程序,显示ds:[si]中的字符串
mov ax,4c00h
int 21h
dtoc: push dx
push si
push cx
push di
mov dx,0
mov di,0
s:mov cx,10
call divdw 第三个子程序,无溢出除法
push cx
inc di
mov cx,ax
jcxz s1
jmp short s
s1:mov cx,di
ok:pop ax
add al,30h
mov [si],al
inc si
loop ok
pop di
pop cx
pop si
pop dx
ret
show_str: push cx
push ax
push bx
push es
push dx
mov ax,0b800h
mov es,ax
mov ax,0a0h
mul dh
mov bx,ax
add dl,dl
mov dh,0
add bx,dx
mov ch,0
mov ah,cl
show:mov cl,[si]
jcxz sok
mov al,cl
mov es:[bx],ax
inc si
add bx,2
jmp short show
sok: pop dx
pop es
pop bx
pop ax
pop cx
ret
divdw: push si
push di
mov si,ax
mov ax,dx
mov dx,0
div cx
mov di,ax
mov ax,si
div cx
mov cx,dx
mov dx,di
pop di
pop si
ret
code ends
end start
