整数转字符串汇编 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 字节的缓冲区就足够了。