由于题目要求将一个word型数据转变为十进制的字符串,因为在进行除法运算的时候有可能会发生除法溢出,因此,调用了一个不会产生溢出的16除法。。完整程序如下,希望大家指正
assume cs:code,ds:date
date segment
dw 8 dup(0)
date ends
code segment
start:
mov ax,date
mov ds,ax
mov si,0
mov ax,0ffffh
call dtoc ;转化为字串
mov dh,0;行
mov dl,0;列
mov cl,2;color
call show_str ;显示
mov ax,4c00h
int 21h
;dtoc program..
; 功能 将word型数据转变为十进制型的字符串,字符串以0为结尾符
;参数 (ax)=word型数据
; ds:si 指向字符串的首地址
; 返回值 无
dtoc:
;各种寄存器的保存
push bx
push di
push cx
push si
mov di,0
change: mov bl,10
mov bh,0
call divword ;不发生溢出的16位除法
add bx,30h
push bx; 余数入?
inc di ;di 计数?
mov cx,ax ;将商移入cx 判断是否为0
jcxz ok
jmp short change
ok:
mov cx,di
;写入指定的地址中
write:
pop bx
mov byte ptr[si],bl
inc si
loop write
mov byte ptr[si],0 ;字符串后写入0作为结束符
pop si
pop cx
pop di
pop bx
ret
;--------the end of dtoc
;the shor_str
;the intruduction of the show_str
;名称:SHOW_STR
;功能:在指定的的位置,指定的颜色,显示一个用0结束的字符串
;参数 (dh)=行号 (取值范围0-24) (dl)=列号(取值范围0-79) (cl)=颜色 ds:si 指向字符串首地址
;返回值: none
show_str:
;save the register values
push es
push ax
push cx
push dx
push di
;work out the addess
mov al,160
mov ah,0
mul dh
mov di,ax
mov al,2
mov ah,0
mul dl
add di,ax
mov ax,0b800h
mov es,ax
mov al,cl ;get the attribute
save:mov cl,[si]
mov ch,0
jcxz okend
mov es:[di],cl
mov es:[di+1],al
add di,2
inc si
jmp short save
okend:pop di
pop dx
pop cx
pop ax
pop es
ret
;-------end of show_str
;divword program
;功能,进行不会产生溢出的除法运算,被除数为word型,除数为8位,结果为word型
;参数 (ax)=被除数 (bl)=除数
; 返回 (ah)=结果的高8位,(al)=结果的低8位 (bl)=余数
divword:
;寄存器的保存
push cx
mov cl,al;cl来保存低位
mov al,ah
mov ah,0
div bl
mov ch,al ;用ch来保存高位的商
mov al,cl
div bl
mov bl,ah
mov ah,ch
pop cx
ret
;------------------------end of divword....
code ends
end start
- [qingpengchen2011] 我的子程序是没错的,我在想是不是虚拟机的问题 08/08 12:17
- [qingpengchen2011] 嗯~行。我再认真详细看看,谢谢咯 08/08 10:38
- [tomato] 我运行了,不是地址的问题。也没有出现崩溃的现象,不过有的子程序功能好像不太对。子程序书中都有,建议你 08/07 22:07
- [tomato] 还是不行吗?我帮你看一下。 08/07 21:29
- [qingpengchen2011] table等标志的值都是在此安装程序中的偏移地址,所以那些子程序等等的地址都是要重新计算的。这点我倒 08/07 18:10
- [qingpengchen2011] table dw sub0-int7ch+200h,sub1-int7ch+200h,sub2-in 08/07 18:06
- [qingpengchen2011] table dw sub0-int7ch+200h,sub1-int7ch+200h,sub2-in 08/07 18:06
- [tomato] 结果也贴上来晾凉吧。 08/05 23:49
- [tomato] 我看不是死循环的问题,是子程序入口地址错了。告诉你一个解决思路,就是单步跟踪读取子程序地址那个地方, 08/05 23:45
- [tomato] 很有可能是你程序的问题,检查一下是不是死循环了。 08/05 23:41