将整数转换为字符串程序集8086 tasm

时间:2016-06-05 17:43:53

标签: assembly x86-16 tasm dosbox

我使用装配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

2 个答案:

答案 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 proc
proc    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字节的缓冲区就足够了。