【问题标题】:TASM Printing a number arrayTASM 打印数字数组
【发布时间】:2025-12-28 23:10:11
【问题描述】:

我正在努力提前完成我的大学课程并自己学习汇编程序,所以我有点卡住了。

我有这个练习问题,我不明白如何正确打印。

我得到了 3 个数字值:var1、var2、var3。例如:var1 = 4、var2 = 5 和 var3 = 6。 我还得到了一个数组 nstr db 7 dup(' ')。

我需要做的是将 var1 + var2 + var3 添加到 nstr[5],将 var1 + var2 添加到 nstr[4] 并将 var1 添加到 nstr[3] 并打印新数组。

.model small
.STACK 100h
.data
    var1 db 4
    var2 db 5
    var3 db 6
    nstr db 7 dup(' ')  
.code
.startup
                            
    mov ax, dgroup
    mov ds, ax
                            
    mov si,6
    mov nstr[si], '$'           
    dec si
    
    mov al, var1
    add al, var2
    add al, var3
    
    mov nstr[si], al
    dec si
    
    sub al, var3
    mov nstr[si], al
    dec si
    
    sub al, var2
    mov nstr[si], al

print:
    mov ah, 09h
    mov dx, offset nstr
    int 21h 

stop:
    mov ah, 4ch
    int 21h
end

每次我尝试打印它时,控制台都会显示一个符号而不是数字。我知道在将数字添加到数组之前,我需要将它们转换为字符串。

我见过的唯一方法是除以 10 并循环该数字,直到其中没有字符,然后将每个字符添加到数组中。

我的问题是我需要在单个数组位置上有一个两位数,在这个例子中 nstr[5] 需要是 15,使用上面的方法我会得到 nstr[2] = 4, nstr[3 ] = 9, nstr[4] = 1 and nstr[5] = 5,这不是我需要的结果,即使打印正确。

有什么办法可以完成这件事吗?谢谢!

【问题讨论】:

  • 正如你所说,你不能将 2 位数字压缩成 1 个字符,所以问题规范似乎是矛盾的。
  • int 21h 是否打印数字或字符?零、一等的 ASCII 码是什么?

标签: assembly dos x86-16 tasm dosbox


【解决方案1】:

每次我尝试打印它时,控制台都会显示一个符号而不是数字。 我知道在将数字添加到数组之前需要将它们转换为字符串

这引出了一个问题:您为什么不进行转换?
对于nstr[3]nstr[4],仅仅加上 48 就会将数字变成可打印的字符。

我见过的唯一方法是除以 10 并循环遍历数字,直到其中没有字符,然后将每个字符添加到数组中。

您可以使用的不仅仅是小数。如果您选择十六进制,则可以解决任务。

.data
    var1 db 4
    var2 db 5
    var3 db 6
    nstr db 7 dup(' ')
    hexa db "0123456789ABCDEF"
.code
.startup                     
    mov ax, dgroup
    mov ds, ax
    mov bx, offset hexa                
    mov si, 6
    mov nstr[si], '$'           
    dec si
    
    mov al, var1
    add al, var2
    add al, var3
    xlatb
    mov nstr[si], al
    dec si

    mov al, var1
    add al, var2
    xlatb
    mov nstr[si], al
    dec si
    
    mov al, var1
    xlatb
    mov nstr[si], al
    ...

上面应该打印:

   49F

或者,使用循环来打印 7 个数组元素的内容:字节大小的数字:

32, 32, 32, 4, 9, 15, 32

nstr 数组是使用空格字符定义的nstr db 7 dup(' '),这并不一定意味着您必须将其用作字符串。最终dup 保留空间,仅此而已。

【讨论】: