当前位置: 代码迷 >> 汇编语言 >> 下面程序调用返回不对,当小弟我调用DwtoString之后,其直接返回到了start,为什么呢
  详细解决方案

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

热度:167   发布时间:2016-05-02 04:47:32.0
下面程序调用返回不对,当我调用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 何意?删除了再试试?
  相关解决方案