|
主题 : : 修改了dtoc 的程序 但是最终显示还是有一点问题 [已解决] |
回复[ 4次 ]
点击[ 394次 ] | |
|
|
|
|
[帖 主]
[ 发表时间: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 | | |
|
|
|
|
[第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和入栈。 | | |
|
|
|
|
[第2楼]
[ 回复时间:2011-08-21 09:23 ]
[引用]
[回复]
[ top ] | |
荣誉值:405
信誉值:0
注册日期:2008-01-19 14:51 |
|
|
|
|
|
[第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 | | |
|
|
|
|
[第4楼]
[ 回复时间:2011-08-21 09:59 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:7
注册日期:2011-06-09 10:21 |
此贴由 贴主 于 [ 2011-08-21 09:59 ] 结贴。 结贴原因:问题已解决 | | |
|