新人送分喜闻乐见. 为什么call的子程序运行时代码不对?
方便好心人调试 我直接把代码贴上来吧 不知道会不会是我操作环境的问题..
每次调用divdw子程序时 ip指向的指令就莫名其妙的变了 全是JEP JB CMPSB POP ES什么的
不运行的时候用-U查看用-D查看都没问题的 一运行就变了 就从 cs:005a那开始扯拐的
代码如下 好人一生平安 帮忙调调看吧 我已经调了无数次了 无奈新手眼见有限 看不出问题啊
assume cs:code,ds:data,ss:stack
data segment
dd 31345,456546,313657,46657,0,0,0,0
db 0 dup(100) ;地址为32
db 0 dup(100) ;地址为132
data ends
stack segment
db 0 dup(200)
stack ends
code segment
start:
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,100
mov si,0
mov di,32
call ddtoc
mov ax,4c00h
int 21h
ddtoc:
s0:
mov bx,0
mov ax,[si] ;读取地位数据
mov dx,[si+2];读取高位数据
mov cx,ax ;判断低位是否为0
jcxz s01;如果为0跳入s11继续判断高位是否为0
jmp short s1;低位不为0进入单个数据转换阶段s1
s01:
mov cx,dx ;该数据为0,结束读取
jcxz over;结束子程序
s1:
mov cx,ax ;判断低位是否为0
jcxz s11;如果为0跳入s11继续判断高位是否为0
jmp short s2;低位不为0进入数-字转换
s11:
mov cx,dx ;判断高位是否为0
jcxz s22 ;为0结束该数据转换完毕 结束读取 跳入写入阶段s22
s2:
mov cx,10 ;初始化被除数
push bx
mov bx,132
call divdw ;调用双字不溢出除法
pop bx
add cx,30h ;余数加30转换为字符
push cx
inc bx
jmp short s1
s22:
mov cx,bx
s3:
pop ax
mov [di],al
inc di
loop s3
s4:
add si,4
add di,2
jmp short s0;增量设置完成,si指向下一个数据 di指向下一块待写入的地址
over:
ret
divdw:
push dx
mov dx,0
div cx
mov [bx],ax
mov [bx+2],dx
pop ax
mov dx,0
div cx
mov [bx+6],ax
mov ax,0
div cx
mov [bx+4],ax
mov [bx+8],dx
mov ax,[bx]
add ax,[bx+4]
mov dx,[bx+6]
push dx
push ax
mov ax,[bx+2]
add ax,[bx+8]
mov dx,0
div cx
mov cx,ax
pop ax
add ax,cx
mov cx,dx
pop dx
;输出结果:dx,高位数,ax,低位数,cx,余数
ret
code ends
end start
[最优解释]
还是认真地看看书,你程序中像下面的语句写的对吗?
db 0 dup(200)
[其他解释]
对了 ,这是个转换32位数到字符串的程序,写得很乱,注释也不完整,见谅哈。
[其他解释]
.... 谢谢gsy999 我就是这个写的时候老写混 ..