|
主题 : : 三个子程序不难,但做设计一时在dos的debug时显示位置正确,但在dos直接执行显示位置不对 [待解决] |
回复[ 3次 ]
点击[ 412次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2009-01-10 10:39 ]
[引用]
[回复]
[ top ] | |
荣誉值:2
信誉值:0
注册日期:2008-05-08 23:42 |
我已经搞的头昏脑胀的程序如下
只是一个要在第八行第三列连续三行显示345980这个数字,在dos里用debug加载直接用g键运行显示正确
但在dos里直接执行时,显示的位置不对,你说调试时是好的,怎么执行时又变了,哪位高手指教一下?
assume cs:code
table segment
dd 345980
table ends
data segment
db 10 dup(0)
data ends
stack segment
dw 8 dup(0)
stack ends
code segment
start: mov ax,table
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,16
mov dh,8 ;第八行
mov dl,3 ;第三列
mov ah,0
mov al,2
mul dl
mov bx,ax
mov al,80*2
mul dh
add bp,ax ;bp里就是第八行第三列的字节数
mov cx,3
s3:mov ax,ds:[0] ;设置ax ,dx参数
mov dx,ds:[2]
push cx
push ds
mov si,0
call dwdtoc ;调用转换双字数字为字符串子程序
call show_str ;调用显示字符串
pop ds
pop cx
loop s3
mov ax,4c00h
int 21h
dwdtoc:mov di,0 ;双字数字转字符串
s: mov cx,10
call divdw ;调用不溢出除法子程序
inc di
add cx,30h
push cx
push ax
add ax,dx
mov cx,ax
pop ax
jcxz ok
jmp short s
ok:mov cx,di
mov ax,data
mov ds,ax
s1: pop [si]
inc si
loop s1
mov ax,data
mov ds,ax
ret
divdw:push ax
push dx
pop ax
mov dx,0
div cx
pop bx
push ax
mov ax,bx
div cx
mov cx,dx
pop dx
ret
show_str: mov ax,0b800h ;显示字符串
mov es,ax
mov ax,data
mov ds,ax
mov ch,0
mov si,0
mov cx,di
s2: mov al,[si]
mov es:[bp],al
inc si
add bp,2
loop s2
mov ah,0
mov al,2
mul di
sub bp,ax
add bp,160 ;bp指向下一行同列位置
ret
code ends
end start | | |
|
|
|
|
[第1楼]
[ 回复时间:2009-01-13 21:02 ]
[引用]
[回复]
[ top ] | |
荣誉值:33
信誉值:0
注册日期:2008-10-16 10:01 |
|
|
|
|
|
[第2楼]
[ 回复时间:2009-02-03 21:24 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2008-11-09 12:50 |
show_str 不用bp做参数吧?
就算用bp做参数,楼主的程序这里:
start: mov ax,table
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,16
mov dh,8 ;第八行
mov dl,3 ;第三列
mov ah,0
mov al,2
mul dl
mov bx,ax
最后这个bx,我想应该是bp吧 | | |
|
|
|
|
[第3楼]
[ 回复时间:2009-02-03 21:28 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2008-11-09 12:50 |
至于头昏脑涨,我想楼主应该明确每个子程序的功能,参数以及结果储存使用的寄存器,外部程序整个其实就是准备参数的一个过程 | | |
|