下面程序调用返回不对,当我调用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