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

Duo*_*uoD 11 string assembly

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

msg db'你好,世界!',0xa

  • 0xa在这里意味着什么?

消息DB'我喜欢它!',0

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

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

在此先感谢任何帮助:)

joh*_*und 10

不同的汇编程序具有不同的语法,但在db指令的情况下,它们非常一致.

db是一个汇编指令,它在指令所在的位置定义具有给定值的字节.可选地,可以将一些标签分配给指令.

常用语法是:

[label]  db  n1, n2, n3, ..., nk
Run Code Online (Sandbox Code Playgroud)

其中n1..nk是一些字节大小的数字(从0..0xff)一些字符串常量.

只要ASCII字符串由字节组成,指令就会将这些字节简单地放在内存中,与指令中的其他数字完全相同.

例:

db 1, 2, 3, 4
Run Code Online (Sandbox Code Playgroud)

将分配4个字节,并用数字1,2,3和4填充它们

string  db 'Assembly', 0, 1, 2, 3
Run Code Online (Sandbox Code Playgroud)

将编译为:

string:  41h, 73h, 73h, 65h, 6Dh, 62h, 6Ch, 79h, 00h, 01h, 02h, 03h
Run Code Online (Sandbox Code Playgroud)

ASCII代码为0Ah(0xa)的字符是在Linux中用作控制台的新行命令的字符LF(换行符).

ASCII码00h(0)的字符是NULL字符,用作C语言中的字符串结尾标记.(可能在OS API调用中,因为大多数操作系统都是用C语言编写的)

附录1:有几个类似于DB的其他汇编指令,它们在内存中定义了一些数据,但是具有其他大小.最常见的是DW(定义字),DD(定义双字)和DQ(定义四字),用于16位,32位和64位数据.但是,它们的语法只接受数字,而不接受字符串.