首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 汇编语言 >

新人送分喜闻乐道. 为什么call的子程序运行时代码不对

2012-12-25 
新人送分喜闻乐见. 为什么call的子程序运行时代码不对?方便好心人调试我直接把代码贴上来吧不知道会不会是

新人送分喜闻乐见. 为什么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  我就是这个写的时候老写混 ..   

热点排行