我使用装配8086 16BIT和tasm汇编程序。 我试图打印一个int变量,为此我需要将变量包含在字符串中。我试图建立一个没有成功的程序。它是完全错误的,不起作用。
你可以帮助我构建这个/解释如何构建它吗?
谢谢你们!
这是我的基本代码:
stepCounter db 0
push offset stepCounter ; Copy the OFFSET of "parameter" into the stack
call toString
proc toStringPrint
push bp
mov bp, sp
mov ax, [bp + 4] ;number
div 10; div number(in ax) by 10
mov [bx], ah
;mov dx, []
;mov ah, 9h
;int 21h
pop bp
ret 4
endp toString
修改
谢谢!这是我现在的代码:但它仍然没有打印
proc toStringPrint
push bp
mov bp, sp
mov si, [bp+4];number
mov ax, [si]
divide:
cmp al, 0
je Print
mov cl, 10
div cl; div number(in ax) by 10
mov [bx], ah
dec bx
jmp divide
Print:
mov dx, [bp + 6]
mov ah, 9h
int 21h
pop bp
ret 4
endp toStringPrint
编辑2 这是当前的代码,仍然会使应用程序崩溃并始终打印219:
stepCounter dW 0
;this is how i call the PROC:
mov cx, [stepCounter]
push cx
call toStringPrint
proc toStringPrint
push bp
mov bp, sp
mov si, [bp+4] ;number location in memory( I think )
mov ax, [si]
mov cl, "$"
mov [bx], cl
divide:
mov ah, 0
mov cl, 10
div cl ; div number(in ax) by 10
dec bx
add ah, 48 ;Make into a character
mov [bx], ah
cmp al, 0
jne divide
Print:
mov dx, bx
mov ah, 9h
int 21h
pop bp
ret 4
endp toStringPrint
答案 0 :(得分:2)
mov ax, [bp + 4] ;number
对这一行的评论是错误的。在[bp+4]
,您会发现 stepCounter 的地址不是它的价值!使用类似的东西:
mov si, [bp+4]
mov ax, [si]
还要使 stepCounter 成为字,而不是字节。
stepCounter dw 0
div
指令不能使用立即操作数。事先将值移动到寄存器。使用CL
,因为您似乎想使用BX
来存储结果:
mov cl, 10
div cl
您的编辑接近解决方案!我在[bp+6]
没有看到你的期望。第一步是使用 $ 符号关闭即将发布的字符串,然后开始添加数字。要始终显示至少1位数,请在最后进行测试。在进行除法之前,不要忘记将AH寄存器归零:
mov cl, "$"
mov [bx], cl
divide:
mov ah, 0
mov cl, 10
div cl ; div number(in ax) by 10
dec bx
add ah, 48 ;Make into a character
mov [bx], ah
cmp al, 0
jne divide
Print:
mov dx, bx
mov ah, 9h
int 21h
答案 1 :(得分:1)
此答案仅针对您的 EDIT 2 。
mov cx, [stepCounter] push cx call toStringPrint
此代码会推送 stepCounter 的实际值,但在此过程中,您将其视为 stepCounter 的地址。只需使用:
启动 toStringPrint procproc toStringPrint
push bp
mov bp, sp
mov ax, [bp+4] ;Value of stepCounter
pop bp ret 4 endp toStringPrint
此代码返回并从堆栈中删除额外的4个字节,但您只在堆栈上推送了2个字节!将其更改为:
pop bp
ret 2
endp toStringPrint
您没有显示此信息但请确保BX指向合适缓冲区的最后一个字节。一个4字节的缓冲区就足够了。