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

Has*_*aza 3 arrays string assembly masm x86-16

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

我所知道的是:

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

var db 'abcde'
Run Code Online (Sandbox Code Playgroud)

这是您声明数组的方式:

var db 'a','b','c'
Run Code Online (Sandbox Code Playgroud)

我不确定这些是否正确,并且我对这两者(数组和字符串)感到困惑

mov ah,9
int 21h
Run Code Online (Sandbox Code Playgroud)

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

Sep*_*and 5

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

aString     db "abcdef", 13, 10, "$"
byteArray   db "a", "b", "c", "d", "e", "f", 13, 10, "$"
Run Code Online (Sandbox Code Playgroud)

您可以用相同的方式输出两者:

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

mov     dx, offset byteArray
mov     ah, 09h    ; DOS.PrintString
int     21h
Run Code Online (Sandbox Code Playgroud)

之所以可行,是因为数组中的元素在内存中紧挨着,因此aString的存储和byteArray的存储没有真正的区别。

有助于区分的是,当人们谈论数组时,他们最感兴趣的是存储在数组元素中的数值,而不是谈论字符串时,他们并不关心字符的实际ASCII码组成字符串。

aString db "abcdef", 13, 10, "$"我们看到的字符一个b,...
byteArray db "a", "b", "c", "d", "e", "f", 13, 10, "$"我们宁愿看到数字9798,...(通常我们会还以数字开始书面吧!)


但是并不是每个数组都是一个字符串,因为您可以将数组包含单词大小的元素或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
Run Code Online (Sandbox Code Playgroud)