运行环境:windows10下的dosbox
dtoc程序是一个把十进制数转换成字符串的程序,我的实现方法是把处理完毕的字符都入栈,然后依次出栈到ds上(也就是pour标签下的程序),但是不知为何pour下一加入pop ax,在dosbox下运行就不出end了,后面发现只要是试图改sp值都不会出end,根本不知道是什么原因
assume cs:code,ds:data
data segment
DB 16 DUP(0)
data ends
code segment
start:
main:
mov ax,data
mov ds,ax
mov dx,000FH
mov ax,4240H
call dtoc
mov ax,4c00h
int 21h
show_str: ;函数介绍:将以0结尾的字符串显示在屏幕上,ds:si指向字符串,其他参数在栈中,为:行号,列号,颜色(由栈顶向栈底)
push bp
mov bp,sp ;bp指向栈顶
mov bx,0b800h ;用es:bx+di指向显存
mov es,bx
mov ax,160 ;根据行和列计算在显存中相应的偏移地址,存入bx中
mul word ptr [bp+4]
mov bx,[bp+6]
add bx,bx
add bx,ax
putchar:
mov ax,ds:[si]
mov es:[bx+di],ax
mov ax,[bp+8]
mov es:[bx+di+1],ax
add di,2
inc si
cmp byte ptr ds:[si],0
je show_str_end
jmp short putchar
show_str_end: ;还原子程序中用到的参数
pop bp
ret
dtoc: ;函数介绍:将DWORD型数据转化为十进制字符串放入栈中,参数为DX(DWORD型数据高16位),AX(DWORD型数据低16位)
push bp
mov bp,sp
dtoc_start:
mov cx,10
call divdw
add cx,30h
push cx
cmp ax,0
je pour
jmp short dtoc_start
pour:
pop ax ;一加入这个就不出现end
; mov byte ptr ds:[si],al
; inc si
; cmp ax,0000h
; je dtoc_end
; jmp pour
dtoc_end:
ret
DIVDW: ;函数介绍:进行不会产生溢出的除法运算,被除数为dword型,除数为word型
;参数为DX(DWORD型数据高16位),AX(DWORD型数据低16位),CX(除数,WORD型)
;结果以DX和AX分别存放结果高16位和低16位,CX存放余数
PUSH AX
MOV AX,DX ;先计算高16位
MOV DX,0
DIV CX
MOV BX,AX ;暂时用BX存放结果的高16位,这时DX要存放运算数
POP AX
DIV CX ;计算出结果低16位
MOV CX,DX ;CX存放余数
MOV DX,BX ;DX存放结果高16位
MOV BX,0
RET
code ends
END START |