欢迎来到Doc100.Net免费学习资源知识分享平台!
您的位置:首页 > 程序异常 >

下面程序调用返回不对,当小弟我调用dwtostring之后,其直接返回到了start,为什么呢

更新时间: 2014-01-05 03:16:36 责任编辑: Author_N1

 

下面程序调用返回不对,当我调用DwtoString之后,其直接返回到了start,为什么呢?
;在实验过程中遇到的问题:1、栈顶元素选取不合理,导致每个位的数字并没有保存完全
   ;2、还有些莫名其妙的错误,不知道怎么就出错了,不知道怎么就好了
   ;3、小技巧:进行除法的时候巧用

assume cs : code  , ss : stack , ds : data

data segment

dw 16 dup(0)

data ends

stack segment

dw 100 dup (0)

stack ends

code segment
start:
mov ax ,stack
mov ss , ax
mov sp , 32h

mov ax , data
mov ds , ax

mov si , 0
mov ax , 4h
mov dx , 0
;mov cx , 2
call DwtoString


mov dh , 4
mov dl , 10
mov cl , 3
call show_str

mov ax , 4c00h
int 21h

;****************************************************************************************************************
;名称:DwtoString
;功能:将dword类型的数转换成表示十进制数的字符串,字符串以0结尾
;参数:(ax)=dword类型数的低十六位
;      (dx)=dword类型数的高十六位
;      ds:si指向字符串的首地址
;返回:无
;****************************************************************************************************************
DwtoString:

push cx
push si
push ax
push bx
;mov ax , 10
mov si , 0

w:
mov cx , 10

call divdw


add cx , 30H
push cx                             ;余数入栈

inc si
mov bx ,ax
add bx , dx
mov cx ,bx
jcxz s0
jmp short w


s0:
inc si
mov cx , si
mov si , 0

s1:
pop ax
mov ds:[si] , ax
add si , 4

loop s1

mov ax , 0
mov ds:[si] , ax ; 以0结束

pop bx
pop ax
pop si
pop cx

ret


;****************************************************************************************************************
;参数: (ax) = dword整数型的低十六位
; (dx) = dword整数型的高十六位
;      (cx) = 除数
;返回: (dx) = 结果的高16位
;      (ax) = 结果的低十六位
;      (cx) = 余数
;******************************************************************************************************************
divdw :
  push ax
  
  mov ax , dx
  mov dx , 0
  div cx
  
  mov bx , ax ;bx保存的是int(H/N)
  
  pop ax
  div cx

  mov cx , dx
  mov dx , bx
  

  ret
;**************************************************************************
;dh 标示行号(0~24)
;dl 标示列号(0~79)
;cl 所输出字符串的属性
;************************************************************************
show_str:
push cx
push si
push di
push dx
push bx
push ax
push es

mov al , 0Ah
mul dh
mov bx , 0B800h
add bx , ax
mov dh , 0
add bx , dx
;以上是计算字符串开始的位置
mov es , bx
mov al , cl   ;保存颜色属性,防止寄存器冲突

qw: mov cx , ds:[si]
;mov ch , 0
jcxz ok
mov es:[di] , cl
mov es:[di+1] , al

add di , 2
add si , 4
jmp far ptr qw

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

code ends
end start






--参考方法--
DwtoString 子程里堆栈不平衡造成的吧,s0: 后的那个 inc si 何意?删除了再试试?
上一篇:上一篇
下一篇:下一篇

 

随机推荐程序问答结果

 

 

如对文章有任何疑问请提交到问题反馈,或者您对内容不满意,请您反馈给我们DOC100.NET论坛发贴求解。
DOC100.NET资源网,机器学习分类整理更新日期::2014-01-05 03:16:36
如需转载,请注明文章出处和来源网址:http://www.doc100.net/bugs/t/20290/
本文WWW.DOC100.NET DOC100.NET版权所有。