TASM 打印一个数字数组
TASM Printing a number array
我正在尝试提前完成我的大学课程并自己学习汇编程序,所以我有点卡住了。
我有这个练习题,我不明白如何正确打印。
我得到了 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
每次我尝试打印它时,控制台都会显示一个符号而不是数字。我知道我需要先将数字转换为字符串,然后再将它们添加到数组中。
我见过的唯一方法是 div 乘以 10 并遍历数字直到其中没有剩余字符,然后将每个字符添加到数组中。
我的问题是我需要在单个数组位置上有一个两位数,在这个例子中 nstr[5] 需要是 15,使用上面的方法我会得到 nstr[2] = 4, nstr [3] = 9,nstr[4] = 1,nstr[5] = 5,这不是我需要的结果,即使打印正确。
有什么办法可以完成这个任务吗?谢谢!
Every time i try to print it, the console displays a symbol instead of the numbers. I understand that I need to convert the numbers to strings before adding them into the array.
这引出了一个问题:您为什么不进行转换?
对于 nstr[3]
和 nstr[4]
,只要加上 48 就可以将数字变成可打印字符。
The only method I have seen is to div by 10 and loop over the number until there is no characters left in it and add every character to the array.
您可以使用的不仅仅是十进制。如果你select16进制就可以解决任务
.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(' ')
,使用 space 字符,并不一定意味着您必须将它用作字符串。最终 dup
保留 space,仅此而已。
我正在尝试提前完成我的大学课程并自己学习汇编程序,所以我有点卡住了。
我有这个练习题,我不明白如何正确打印。
我得到了 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
每次我尝试打印它时,控制台都会显示一个符号而不是数字。我知道我需要先将数字转换为字符串,然后再将它们添加到数组中。
我见过的唯一方法是 div 乘以 10 并遍历数字直到其中没有剩余字符,然后将每个字符添加到数组中。
我的问题是我需要在单个数组位置上有一个两位数,在这个例子中 nstr[5] 需要是 15,使用上面的方法我会得到 nstr[2] = 4, nstr [3] = 9,nstr[4] = 1,nstr[5] = 5,这不是我需要的结果,即使打印正确。
有什么办法可以完成这个任务吗?谢谢!
Every time i try to print it, the console displays a symbol instead of the numbers. I understand that I need to convert the numbers to strings before adding them into the array.
这引出了一个问题:您为什么不进行转换?
对于 nstr[3]
和 nstr[4]
,只要加上 48 就可以将数字变成可打印字符。
The only method I have seen is to div by 10 and loop over the number until there is no characters left in it and add every character to the array.
您可以使用的不仅仅是十进制。如果你select16进制就可以解决任务
.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(' ')
,使用 space 字符,并不一定意味着您必须将它用作字符串。最终 dup
保留 space,仅此而已。