您的位置:首页 > 其它

实验10.3_数值显示拓展_dword型数转变为表示十进制数的字符串

2014-04-18 21:54 330 查看
assume cs:code
data segment
db 10 dup (0)
data ends
code segment
start : mov ax,4240H;F4240H=1000000
mov dx,0FH
mov cx,0AH
mov bx,data
mov ds,bx
mov si,0
call dtoc

mov dh,8
mov dl,3
mov cl,2
call show_str

mov ax,4c00h
int 21h
dtoc:   push ax;子程序中使用的寄存器入栈
push bx
push cx
push dx
push di
push si

mov di,0;计数器,记录余数的个数
s1: mov cx,10;除数
call divdw
inc di
add cx,30H;余数+30H转化为ASCII码
push cx
cmp dx,0
jne s1
cmp ax,0
jne s1

mov cx,di
p:  pop ds:[si]
inc si
loop p
;由于show_str的需要,ds:di处的字符串以零作尾。
;mov byte ptr ds:[si],0这条语句有无皆可,因为最后一次入栈的时候高8位一定是零

pop si;子程序中使用的寄存器出栈
pop di
pop dx
pop cx
pop bx
pop ax
ret
show_str:
push ax;子程序中使用的寄存器入栈
push cx
push dx
push ds
push es
push si
push di

mov al,160;计算行号和列号对应的显存地址
mov ah,0;不要忽略了
dec dh
mul dh
dec dl
add dl,dl
mov dh,0;不要忽略了
add ax,dx
mov di,ax

mov dl,cl;由于下面的jcxz指令要用到cx,所以用dl保存cl的值

mov ax,0b800h
mov es,ax
s:   mov al,ds:[si]
mov cl,al
mov ch,0
jcxz ok
mov es:[di],al
mov es:[di+1],dl;颜色属性被保存在dl中
inc si
add di,2
jmp short s
ok:  pop di;子程序中使用的寄存器出栈
pop si
pop es
pop ds
pop dx
pop cx
pop ax
ret

divdw:  push bx;要用到的寄存器bx、di入栈,下面用它来暂存参数的值
push di;不要将ax,dx,cx入栈,因为程序的目的最终是要修改它们的值
mov bx,ax
mov ax,dx
mov dx,0
div cx;这一步做完以后,ax中为结果的高十六位,即int(H/N),dx中是rem(H/N)的值
mov di,ax
mov ax,bx
div cx;这一步做完以后,ax中为结果的低16位,dx中存储余数
mov cx,dx
mov dx,di

pop di
pop bx
ret
code ends
end start


;子程序描述:

;名称:dtoc

;功能:将dword型数转变为表示十进制数的字符串,字符串以0为结尾符。

;参数:(ax)= dword型数据的低16位

; (dx)= dword型数据的高16位

; ds:si指向字符串的首地址

;返回:无

;应用举例:编程,将数据1000000以十进制的形式在屏幕的8行3列,用绿色显示出来。

;在显示时我们调用本次实验中的第一个子程序show_str和第二个子程序divdw

;思路类似实验10.3_数值显示

;总结:在实际编程中,程序的模块化是必不可少的。因为现实的问题比较复杂,对现实

;问题进行分析时,把它转化成相互联系、不同层次的子问题,是必须的解决方法。利用

;call和ret指令,我们可以用简捷的方法,实现多个相互联系、功能独立的子程序来解

;决一个复杂的问题。

;----摘自汇编语言_模块化程序设计
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: