【问题标题】:Assigning value to variable in x86 (NASM)在 x86 (NASM) 中为变量赋值
【发布时间】:2012-10-08 06:10:15
【问题描述】:

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

我遵循了一些打印“Hello world”的在线教程,并在 NASM 手册中进行了一些研究。一切都很好。所以,我给自己设置了一个循环打印“hello world”的任务。我知道我可以使用loop 操作码来做到这一点,但我想对其进行显式编码并使用.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 手册,但似乎找不到我需要的信息。有人可以帮忙吗?这是我的(简单!)代码:

; print "Hello world!" to the screen multiple times

section .data
    msg:    db  'Hello world!', 10
    msglen: equ $ - msg

section .bss
    iter:   resb    1

section .text
    global _start

_start:

    ; loop 10 times
    mov iter, 0     ; initalise loop counter
FL: cmp iter, 10    ; is iter == 10?
    jge LoopEnd

    ; write the message to STDOUT:
    mov eax,4       ; code for write syscall
    mov ebx,1       ; stdout fd
    mov ecx,msg     ; message to print...
    mov edx,msglen  ; ...and it's length
    int 80h         ; kernel interrupt

    ; increment loop iterator
    inc iter
    jp FL

LoopEnd:


    ; now exit, with return code 0:
    mov eax,1
    mov ebx,0
    int 80h

【问题讨论】:

    标签: assembly nasm


    【解决方案1】:

    要在 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] 是地址处的数据?是的?我不明白为什么我需要告诉它 iter 是一个字节 - 我将它定义为 .bss 部分中的一个字节。不过我会在手册中查找答案!是的——我可以用寄存器来做,但我想使用 .bss 部分的变量来证明我可以!谢谢。
    • iter 只是一个地址。具体来说,您resb'd 的那个字节的地址。因此,由您决定要进行多大的内存访问。这是装配工,真的没有为你做任何事情:-)
    【解决方案2】:

    我认为它必须放在括号中。试试[iter]。

    如有此类问题,请随时联系NASM docs。

    在这种情况下,Effective Addresses 上的部分:

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

    wordvar dw 123
    mov ax,[wordvar]
    mov ax,[wordvar+1]
    mov ax,[es:wordvar+bx]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多