Assembly 为x86中的变量赋值(NASM)

Assembly 为x86中的变量赋值(NASM),assembly,nasm,Assembly,Nasm,我决定学汇编是为了好玩。我已经用C编写代码很多年了 我学习了一些打印“Hello world”的在线教程,并在NASM手册中翻了一番。一切都很好。所以,我给自己设定了一个任务,在循环中打印“hello world”。我知道我可以使用循环操作码来实现这一点,但我想显式地对其进行编码,并使用.bss部分中定义的变量 但是,当我收到错误消息时,我显然误解了变量赋值在程序集中的工作方式: nasm -felf -o hello.o hello.asm hello.asm:16: error: inval

我决定学汇编是为了好玩。我已经用C编写代码很多年了

我学习了一些打印“Hello world”的在线教程,并在NASM手册中翻了一番。一切都很好。所以,我给自己设定了一个任务,在循环中打印“hello world”。我知道我可以使用
循环
操作码来实现这一点,但我想显式地对其进行编码,并使用
.bss
部分中定义的变量

但是,当我收到错误消息时,我显然误解了变量赋值在程序集中的工作方式:

nasm -felf -o hello.o hello.asm
hello.asm:16: error: invalid combination of opcode and operands
hello.asm:17: error: invalid combination of opcode and operands
hello.asm:28: error: invalid combination of opcode and operands
我尝试在网上搜索变量赋值的信息,包括NASM手册,但似乎找不到我需要的信息。有人能帮忙吗?以下是我的(简单!)代码:


我认为应该放在括号里。试试
[iter]

如果您有这样的问题,请参阅

在这种情况下,有关以下内容的章节:

有效地址是引用内存的指令的任何操作数。在NASM中,有效地址有一个非常简单的语法:它们由一个表达式组成,该表达式计算所需的地址,并用方括号括起来。例如:


要在nasm中进行内存引用,必须用方括号括住地址。此外,在这里的每种情况下,还需要指定一个大小,如下所示:

    mov byte [iter], 0     ; initalise loop counter
FL: cmp byte [iter], 10    ; is iter == 10?

    inc byte [iter]

不过,在这种情况下,将
iter
存储在寄存器中而不是内存中可能更有意义。您的系统调用正在破坏大多数明显的功能,但是
esi
edi
看起来可用。

谢谢-这就解决了问题。这有点像c指针去引用?”iter'是地址,但[iter]是地址上的数据吗?对我不明白为什么我需要告诉它,国际热核实验堆是一个字节,虽然-我定义了它作为一个字节在.bss节。不过,我会在手册中查找答案!是的,我可以用寄存器来完成,但我想用.bss部分的变量来证明我可以!谢谢。
iter
只是一个地址。具体地说,就是您
resb
'd的那一个字节的地址。因此,由您指定要进行的内存访问的大小。这是装配工,没有为你做任何事情:-)
wordvar dw 123
mov ax,[wordvar]
mov ax,[wordvar+1]
mov ax,[es:wordvar+bx]
    mov byte [iter], 0     ; initalise loop counter
FL: cmp byte [iter], 10    ; is iter == 10?

    inc byte [iter]