在程序集中定义字符串常量的语法是什么?

时间:2013-10-22 19:33:59

标签: string assembly

我正在学习汇编我看到两个定义字符串的例子:

msg db'Hello,world!',0xa

  • 这里的0xa是什么意思?
消息DB'我爱它!',0

  • 为什么我们这里有0?
  • 是一个尾随空字符吗?
  • 为什么我们有0xa上面的例子但这里有0? (似乎它们与字符串长度无关)

如果以上示例是两种定义汇编字符串的方法,程序如何区分它们?

感谢您的任何帮助:)

3 个答案:

答案 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字符终止以表示其结束。