汇编语言中String和Array之间的区别

时间:2019-05-19 20:03:20

标签: arrays string assembly masm x86-16

我目前正在使用MASM在DOSBox上进行汇编编程(16位)。

我知道的是

这是您声明字符串的方式:

var db 'abcde'

这是您声明数组的方式:

var db 'a','b','c'
  

我不确定这些是否正确,我对   这两个,数组和字符串

mov ah,9
int 21h
  

上面的代码显示输出字符串而不显示输出数组吗?

2 个答案:

答案 0 :(得分: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 ,...(通常我们也会以数字开头!)


但并非每个 array 都是字符串,因为您可以将数组包含单词大小的元素或dword大小的元素。

byteArray  db 1, 2, 3     <== 3 bytes storage
wordArray  dw 1, 2, 3     <== 6 bytes storage
dwordArray dd 1, 2, 3     <== 12 bytes storage

答案 1 :(得分:3)

字面上没有什么区别;它们都将相同字节的数据组装到输出文件中。 (或者如果您在“数组”版本中包含'd''e',他们也会这样做。)

我认为MASM的SIZEOF运算符将以两种方式包括整行声明。

字符串是数组的一种特殊情况,基本上只是将多个字符赋予一个db指令的便捷语法。


请注意,有时单词“ string”表示隐式长度的字符串,以0'$'字节为终止符。因此,您可以将 just 指针传递给起始位置,而不是将指针+长度传递给显式长度的字符串。