gpt4 book ai didi

assembly - 在 x86 (NASM) 中为变量赋值

转载 作者:行者123 更新时间:2023-12-02 07:39:14 25 4
gpt4 key购买 nike

我决定学习汇编是为了好玩。我已经用 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

最佳答案

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

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

inc byte [iter]

不过,在这种情况下,存储 iter 可能更有意义。在寄存器中而不是在内存中。你用你的系统调用破坏了大部分明显的调用,但是 esiedi看起来可用。

关于assembly - 在 x86 (NASM) 中为变量赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12943570/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com