|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大佬们是这样的,实验10我的dtoc和show_ptr函数单独调用都是正确的,但是当我把他们放在一起后就会出错。比如我输入7894这个数字,我想把它转变为屏幕上的7894,我用dtoc函数可以在把他转变为 37,38,39,34存入内存中,但是在调用show——ptr函数就会显示 “26353366”不是我想要的 “7894”,但是如果我直接把 7894 直接写成 db ’ 7894 ‘,在调用show_ptr就可以成功在屏幕上显示成 “7894” ,我用debug调试发现都是正确的,能帮我看看是哪出了问题吗? 下面是我的代码:
assume cs:codesg,ss:stack
data segment
db 10 dup (0)
data ends
stack segment
db 100 dup (0)
stack ends
codesg segment
start:
mov ax,7894
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:
mov cx,0
mov si,1
dtoc_s:
mov bx,10
push si
call divdw
pop si
add bx,30h ;余数加30得到ascii码
push bx
mov cx,dx ;把商扔给cx判断是否为0
jcxz dtoc_ruling
inc si
jmp short dtoc_s
dtoc_ruling:
mov cx,ax
jcxz dtoc_displace
inc si
jmp short dtoc_s
dtoc_displace:
mov cx,si
mov si,0
dtoc_loop:
pop ds:[si]
inc si
loop dtoc_loop
mov ds:[si+1],byte ptr 0
ret
divdw:
push ax
mov ax,dx
mov dx,0h
div bx
mov di,ax ;存高位除法商
mov si,dx ;存高位除法余数
pop ax
div bx
mov bx,dx
mov dx,di
ret
show_str:
mov ax,0b800h
mov es,ax ;显示区域内存
mov ch,0
mov ax,0
mov di,0
mov al,160
mul dh ;计算的是显示区域的m行
mov si,ax
mov ax,2
mul dl
add si,ax ;以显示区域的第m行第n列开始
mov ah,cl ;显示属性
show_ptr_s:
mov cl,ds:[di]
jcxz show_ptr_ok ;判断有没有遇到0,遇到条转,反之向下走
mov al,cl
mov es:[si],ax ;吧内存中数据复制进显示区域内存
add si,2
inc di
jmp short show_ptr_s
show_ptr_ok:
ret
codesg ends
end start
|
|