. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->CALL和RET指令
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  修改了dtoc 的程序  但是最终显示还是有一点问题  [已解决] 回复[ 4次 ]   点击[ 394次 ]  
xwill
[帖 主]   [ 发表时间:2011-08-20 23:25 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:7
注册日期:2011-06-09 10:21
http://www.asmedu.net/bbs/pasteinfo.jsp?part=1&level=book&kind=1011&qkSg=2&qID=62164&readSg=1
上面那篇是我第一天发的,然后第二天就修改了下dtoc 子程序 有很所错误下面是修改后的程序 看的话直接跳过去show_str 的那一段就行了那段是我直接从前面的show_str 复制的,没有丝毫改变。
问题是最后没有显示12666中的那个1 。


assume cs:code 

data segment 
db 10 dup(0)
data ends 

stack segment
db 16 dup(0)
stack ends

code segment
start:
mov ax,12666
mov bx,data
mov ds,bx
mov si,0
call dtoc

mov dh,8
mov dl,8 ;这里修改了下显示的位置,最后只是位置不一样。没什么
mov cl,2
call show_str

mov ax,4c00h
int 21h

dtoc:
push dx
push bx
push ax
push cx
push es
push si

mov dx,0
push dx ;后面入栈再出栈的判断条件jcxz dtoc_ok 在dtoc_s2里面会用到的

dtoc_s1:
mov dx,0
mov bx,10;32位的除法运算
div bx 
mov cx,ax
jcxz dtoc_s2
add dx,30h
push dx ;因为除的数是相反的所以入栈再出栈就可以调整顺序
jmp short dtoc_s1


dtoc_s2:
pop cx ;用cx先判断 是否需要跳转
jcxz dtoc_ok 
mov dx,cx  ;如果cx 不需要跳转就传递
mov ds:[si],dx
inc si
jmp short dtoc_s2

dtoc_ok:
mov ax,0
mov ds:[si],ax
pop si
pop es
pop cx
pop ax
pop bx
pop dx
ret 

show_str:
push ax
push es
push dx
push bx
push si
push cx

mov ax,0b800h
mov es,ax;显存的段地址

dec dh
mov al,160
mul dh
mov bx,ax
dec dl
mov al,2
mul dl 
add bx,ax
mov dl,cl

s_show_str:
mov ch,0
mov cl,ds:[si]
jcxz ok
mov es:[bx],cl
mov es:[bx+1],dl
inc si
add bx,2
jmp s_show_str

ok:  
pop cx
pop si
pop bx
pop dx
pop es
pop ax
ret

code ends
end start
tomato
[第1楼]   [ 回复时间:2011-08-21 09:22 ]   [引用]   [回复]   [ top ] 
荣誉值:405
信誉值:0
注册日期:2008-01-19 14:51
“dtoc_s1: 
mov dx,0 
mov bx,10;32位的除法运算 
div bx  
mov cx,ax 
jcxz dtoc_s2 
add dx,30h 
push dx ;因为除的数是相反的所以入栈再出栈就可以调整顺序 
jmp short dtoc_s1 


这段程序中第一个转移条件是商为零,当商为零的时候,还有个余数你没有加30h和入栈。
tomato
[第2楼]   [ 回复时间:2011-08-21 09:23 ]   [引用]   [回复]   [ top ] 
荣誉值:405
信誉值:0
注册日期:2008-01-19 14:51
所以最高位的‘1’没有显示。
xwill
[第3楼]   [ 回复时间:2011-08-21 09:59 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:7
注册日期:2011-06-09 10:21
搞定了 ,谢谢。

assume cs:code 

data segment 
db 10 dup(0)
data ends 

stack segment
db 16 dup(0)
stack ends

code segment
start:
mov ax,12666
mov bx,data
mov ds,bx
mov si,0
call dtoc

mov dh,8
mov dl,8 ;这里修改了下显示的位置,最后只是位置不一样。没什么
mov cl,2
call show_str

mov ax,4c00h
int 21h

dtoc:
push dx
push bx
push ax
push cx
push es
push si

mov dx,0
push dx ;后面入栈再出栈的判断条件jcxz dtoc_ok 在dtoc_s2里面会用到的

dtoc_s1:
mov dx,0
mov bx,10;32位的除法运算
div bx 
mov cx,ax
jcxz dtoc_s2
add dx,30h
push dx ;因为除的数是相反的所以入栈再出栈就可以调整顺序
jmp short dtoc_s1


dtoc_s2:
add dx,30h
push dx    ;最后的余数1加上30h  

dtoc_s3:
pop cx ;用cx先判断 是否需要跳转
jcxz dtoc_ok 
mov dx,cx  ;如果cx 不需要跳转就传递
mov ds:[si],dx
inc si
jmp short dtoc_s3

dtoc_ok:
mov ax,0
mov ds:[si],ax
pop si
pop es
pop cx
pop ax
pop bx
pop dx
ret 

show_str:
push ax
push es
push dx
push bx
push si
push cx

mov ax,0b800h
mov es,ax;显存的段地址

dec dh
mov al,160
mul dh
mov bx,ax
dec dl
mov al,2
mul dl 
add bx,ax
mov dl,cl

s_show_str:
mov ch,0
mov cl,ds:[si]
jcxz ok
mov es:[bx],cl
mov es:[bx+1],dl
inc si
add bx,2
jmp s_show_str

ok:  
pop cx
pop si
pop bx
pop dx
pop es
pop ax
ret

code ends
end start
xwill
[第4楼]   [ 回复时间:2011-08-21 09:59 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:7
注册日期:2011-06-09 10:21
此贴由 贴主 于 [ 2011-08-21 09:59 ] 结贴。 结贴原因:问题已解决
得分情况: 1楼(tomato):6分  
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved