汇编语言中字符串和数组的区别

3
我目前正在使用MASM在DOSBox上进行汇编程序设计(16位)。
我所知道的是:
这是如何声明一个字符串的:
var db 'abcde'

这是声明数组的方式:
var db 'a','b','c'

“我不确定这些是否正确,我在数组和字符串之间感到困惑。”
mov ah,9
int 21h

以上代码显示输出字符串而不是输出数组吗?
2个回答

5

每个字符串都可以看作是一个字节数组

aString     db "abcdef", 13, 10, "$"
byteArray   db "a", "b", "c", "d", "e", "f", 13, 10, "$"

你可以用同样的方式输出两者:
mov     dx, offset aString
mov     ah, 09h    ; DOS.PrintString
int     21h

mov     dx, offset byteArray
mov     ah, 09h    ; DOS.PrintString
int     21h

这是因为数组中的元素在内存中紧密地跟随在一起,所以对于aString和byteArray,存储上没有实际区别。而区分它们的一点是,当人们谈论一个数组时,他们主要关心的是存储在数组元素中的数值,而谈论一个字符串时,他们不关心组成字符串的字符的实际ASCII代码。
在 `aString db "abcdef", 13, 10, "$"` 中,我们看到字符 a、b、...,而在 `byteArray db "a", "b", "c", "d", "e", "f", 13, 10, "$"` 中,我们看到数字 97、98、...(通常我们开始编写时也会使用数字)。
但并非所有的“数组”都是字符串,因为您可以有具有字长元素或双字长元素的数组。
byteArray  db 1, 2, 3     <== 3 bytes storage
wordArray  dw 1, 2, 3     <== 6 bytes storage
dwordArray dd 1, 2, 3     <== 12 bytes storage

使用字大小的元素会更加复杂,因为不同的汇编器使用不同的约定,请参见 https://euroassembler.eu/eadoc/#CharacterConstans。 - vitsoft

3
实际上,它们没有任何区别;它们都将数据的相同字节组装到输出文件中。(如果您在“数组”版本中包含了'd'和'e',它们也会这样做。)我认为MASM的SIZEOF运算符将以任何方式包含整行声明。字符串是数组的一种特殊情况,基本上只是一个方便的语法,用于将多个字符给定给一个db指令。请注意,有时候,“字符串”一词意味着隐式长度字符串,以0或'$'字节作为终止符。因此,只需传递指向开头的指针即可,而不需要为显式长度字符串传递指针+长度。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接