整数转字符串汇编 8086 tasm
Convert integer to string assembly 8086 tasm
我正在使用带有 tasm 汇编器的汇编 8086 16BIT。
我正在尝试打印一个 int 变量,为此我需要将我的变量转换为字符串。我试图建立一个没有成功的过程。它完全错误,无法正常工作。
你能帮我构建吗this/explain如何构建这个?
谢谢大家!
这是我现在的基本代码:
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
mov ax, [bp + 4] ;number
这一行的评论是错误的。在 [bp+4]
你会发现 stepCounter 的地址而不是它的值!使用类似:
mov si, [bp+4]
mov ax, [si]
同时将 stepCounter 设为 word 而不是 byte.
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
此答案仅针对您的 EDIT 2。
mov cx, [stepCounter]
push cx
call toStringPrint
此代码推送 stepCounter 的实际值,但在过程中您将其视为 stepCounter 的地址。只需启动 toStringPrint 过程:
proc toStringPrint
push bp
mov bp, sp
mov ax, [bp+4] ;Value of stepCounter
pop bp
ret 4
endp toStringPrint
此代码 returns 并从堆栈中删除了额外的 4 个字节,但您只将 2 个字节压入堆栈!将其更改为:
pop bp
ret 2
endp toStringPrint
您没有显示此内容,但请确保 BX 指向合适缓冲区的最后一个字节。一个 4 字节的缓冲区就足够了。
我正在使用带有 tasm 汇编器的汇编 8086 16BIT。 我正在尝试打印一个 int 变量,为此我需要将我的变量转换为字符串。我试图建立一个没有成功的过程。它完全错误,无法正常工作。
你能帮我构建吗this/explain如何构建这个?
谢谢大家!
这是我现在的基本代码:
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
mov ax, [bp + 4] ;number
这一行的评论是错误的。在 [bp+4]
你会发现 stepCounter 的地址而不是它的值!使用类似:
mov si, [bp+4]
mov ax, [si]
同时将 stepCounter 设为 word 而不是 byte.
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
此答案仅针对您的 EDIT 2。
mov cx, [stepCounter] push cx call toStringPrint
此代码推送 stepCounter 的实际值,但在过程中您将其视为 stepCounter 的地址。只需启动 toStringPrint 过程:
proc toStringPrint
push bp
mov bp, sp
mov ax, [bp+4] ;Value of stepCounter
pop bp ret 4 endp toStringPrint
此代码 returns 并从堆栈中删除了额外的 4 个字节,但您只将 2 个字节压入堆栈!将其更改为:
pop bp
ret 2
endp toStringPrint
您没有显示此内容,但请确保 BX 指向合适缓冲区的最后一个字节。一个 4 字节的缓冲区就足够了。