我目前正在使用MASM在DOSBox上进行汇编编程(16位)。
我知道的是
这是您声明字符串的方式:
var db 'abcde'
这是您声明数组的方式:
var db 'a','b','c'
我不确定这些是否正确,我对 这两个,数组和字符串
mov ah,9
int 21h
上面的代码显示输出字符串而不显示输出数组吗?
答案 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 指针传递给起始位置,而不是将指针+长度传递给显式长度的字符串。