我在Linux下编程nasm时遇到问题。
我的问题是

/home/maximilian/Schreibtisch/Programmierung/meinCompiler/var2.asm:6:  warning: character constant too long
    /home/maximilian/Schreibtisch/Programmierung/meinCompiler/var2.asm:6: error: invalid combination of opcode and operands
    /usr/bin/ld: cannot find /home/maximilian/Schreibtisch/Programmierung/meinCompiler/var2.o: Datei oder Verzeichnis nicht gefunden

我的nasm代码:
section .data

section .text
global _start:
_start:
mov HALLO, "HALLO"
mov eax, 1
mov ebx, 0
int 0x80

section .bss
HALLO: resb 4

有人能帮我吗?
我已经搜索过这个话题,但是还没有找到任何关于NASM新手的全面信息
希望你能回应我,
全日制哲学博士

最佳答案

如果要在.data中声明内存内容:

section .data
HALLO: db 'HALLO'

您将创建:
编译起点:一个名为HALLO的符号,它包含指向'H'字符的地址
从linux可执行文件的角度:5字节长的数组,包含字节72,65,76,76,79,在读写初始化(加载可执行文件一次)内存区域。
所以现在你可以做如下事情:
mov   eax,HALLO                    ; loads value of symbol HALLO into register eax
  ; value of symbol HALLO is address of that array
mov   DWORD [eax+2],0x454D504C     ; writes number over 'LLO?' in that array
  ; creating string 'HALPME' in memory at address HALLO
  ; BUG: notice how 1 character is overwritten after the original array
  ; this may overwrite and destroy some other important value in .data

如果您想在.rodata部分创建它,那么尝试修改它是不明智的。详见NASM sections manual
如果您在.bss中创建它,那么应该像最初那样取消对数组的初始化,将可执行文件加载到内存中只会保留该空间,而不会初始化它。
你不能做mov HALLO, "HALLO",这不是x86程序集的工作方式。
最接近它的是mov DWORD [HALLO],'HALL'mov BYTE [HALLO+4],'O'。在32b模式下,单指令不能存储5个字节。
因此,如果要将某个内存数组设置为某个初始值字符串,请使用.data部分,在初始文本字节之后添加linetimes 64 db 0以将其放大64字节(以便以后可以用较长的字符串覆盖它)。-如果希望每次运行可执行文件时初始化一次。
或者将“HALLO”放入.rodata中,使用某种机制标记字符串的长度(或者将其作为数字5放在某处,或者在O后面添加第6个字节,并使用0或其他终止符($在DOS中用于int 21h)。在.bss中创建足够长的缓冲区,比如stringBuffer: resb 69。然后每次你想把它设置为'HALLO',你就必须把5个字节从addressHALLO复制到addressstringBuffer
顺便说一句,注意在这样的例子中,用符号HALLO命名值“HALLO”是多么的尴尬,因为现在您必须特别注意识别我所说的label(符号/地址)在哪里,以及我将它用作文本值(字节)在哪里。
总的来说,如果您只是从ASM开始,请从字符串移到数字(不要试图输出它们,只需在调试器中运行并通过调试器查看寄存器/内存值)。
熟悉byte/word/dword、地址和基本算术指令后,检查字符串在内存中的编码方式(ASCII/UTF-8/UTF-16),以及从数字机(CPU)的位置看字符串的外观。或者按照任何nasm教程,它很可能会以一些“hello world”显示开始,这可能不会深入解释为什么magicdb 'hello world',10在int 80h(eax,4;…)中作为字符串工作。
最后,x86标签上的信息相当大,包含许多其他资源:
https://stackoverflow.com/tags/x86/info

08-16 11:59