什么是用于测试数据库的含义是“世界,你好”在集会为X86架构的Linux系统上

问题描述:

最近,我已经开始通过YouTube频道学习大会,并有一些问题有关声明中部分的标签。数据什么是用于测试数据库的含义是“世界,你好”在集会为X86架构的Linux系统上

当我们写下如下所示的内容:test db“hello world”,是标记“测试”,类似于程序语言中的指针吗?(这意味着它保存文本“hello world”中第一个元素的内存地址)

当我们写:mov rsi test,是否意味着我们把“hello world”的地址放入rsi寄存器中?

另一个问题是关于[]的用法,写[test]的含义是什么? 这是否意味着像C中的解引用?就像derefernce指针测试,并得到字母“t”,这是“hello world”中的第一个字母?

我将非常感谢任何负责任的我的问题。

+0

为了一个好的答案,张贴你参考的程序的源代码将是有用的。 – fuz

+2

'test'是''h''的地址。完整的“hello world”是几个字节,占用内存中的几个地址。顺便说一下,海事组织观看YouTube的东西,比如学习ASM必须比阅读有关它的好书要慢得多(这可能会解释所有这一切)。我会对视频形式的任何asm教程的质量非常怀疑,因为这种形式不能涵盖足够的细节(但可以是一个开始)。 – Ped7g

+0

我认为这是一个很好的重复目标;它似乎涵盖了你所要求的。 'test:db“hello world”的C等价物是'char test [] = {'h','e',...,'d'};'(没有终止零字节)。或者,如果它在'section .rodata'中,那么'const char test [] = ...'。 –

是的,基本上几乎所有的猜测都是正确的。

标签和C指针之间的最大区别在于指针实际上是存储的,并且可以在执行过程中进行修改,但标签只有汇编程序已知(除非使用全局指令导出到符号表),所以标签是内存地址,但它是恒定的,不能在执行期间修改。

[]语法经常意味着“数据存储在”,但它确实影响汇编程序对指令的编码方式,所以它确实取决于它所使用的指令。例如,lea指令使用[]语法进行地址算术运算,但不访问结果地址处的内存。但是,如果与移动一起使用,它仍然会对算术进行寻址,但也会访问存储在结果地址中的值。

不要把它当作'操作符',把它看作操作数编码。

+0

'lea'有点像C中的'&'运算符。所以'lea rax,[rdi + rsi]'就像'uint64_t rax =(uint64_t)&rdi [rsi]'。 [这基本上是一种公开CPU硬件的寻址模式解码能力的方式,用作移位和加法指令](https://*.com/a/46597375/224132)。它仍然使用正常寻址模式的机器码编码,所以它使用相同的asm语法是有道理的。 –

+0

好的,这就是我想说的。我的观点是,你不能真正将[]当作解引用运算符,因为它不是,它用于访问寻址模式编码,这不一定是取消引用地址。 – prushik

+0

我猜想我想说它*是*某种deref操作符,但是您可以用''lea''取消它,就像'&''在C中取消''''''或'[]'一样。我必须同意这是一种令人困惑的方式来看待asm语法! –