我正在学习汇编我看到两个定义字符串的例子:
msg db'Hello,world!',0xa
如果以上示例是两种定义汇编字符串的方法,程序如何区分它们?
感谢您的任何帮助:)
答案 0 :(得分:10)
不同的汇编程序具有不同的语法,但在db
指令的情况下,它们非常一致。
db
是一个汇编指令,用于在指令所在的位置定义具有给定值的字节。可选地,可以将一些标签分配给指令。
常用语法是:
[label] db n1, n2, n3, ..., nk
其中n1..nk是一些字节大小的数字(从0..0xff开始)或某个字符串常量。
只要ASCII字符串由字节组成,指令就会将这些字节放在内存中,与指令中的其他数字完全相同。
示例:
db 1, 2, 3, 4
将分配4个字节,并用数字1,2,3和4填充它们
string db 'Assembly', 0, 1, 2, 3
将编译为:
string: 41h, 73h, 73h, 65h, 6Dh, 62h, 6Ch, 79h, 00h, 01h, 02h, 03h
ASCII码0Ah(0xa)的字符是Linux中用作控制台的新行命令的字符LF(换行符)。
ASCII码00h(0)的字符是NULL字符,用作C语言中的字符串结尾标记。 (可能在OS API调用中,因为大多数操作系统都是用C语言编写的)
附录1:有几个类似于DB的其他汇编指令,因为它们在内存中定义了一些数据,但是具有其他大小。最常见的是DW(定义字),DD(定义双字)和DQ(定义四字),用于16位,32位和64位数据。但是,它们的语法只接受数字,而不接受字符串。
答案 1 :(得分:1)
0是尾随空,是的。 0xa是换行符。它们没有定义相同的字符串,因此您可以区分它们。
答案 2 :(得分:1)
0xa
代表十六进制值"A"
,小数为10
。换行控制字符有ASCII代码10(返回有十六进制或十进制十进制)。
字符串通常由nul
字符终止以表示其结束。