【问题标题】:Compile assembly program in SASM IDE在 SASM IDE 中编译汇编程序
【发布时间】:2016-05-06 13:04:30
【问题描述】:

SASM IDE 是一个支持 NASM 的跨平台 IDE。它提供调试功能,在程序执行过程中观察寄存器。以下代码使用 NASM 编译没有任何问题。

    section .data
hello   db "Hello World!",0xa
len equ $-hello

    section .text
    global  _start

_start:
    mov eax, 4
    mov ebx, 1
    mov ecx, hello
    mov edx, len
    int 80h

    mov eax, 1 ; exit(0)
    mov ebx, 0
    int 80h 

但是,如果您尝试在 SASM IDE 中执行相同的代码,它就不起作用。这里是完整的错误信息。

[14:46:07] 警告!构建中出现错误: /tmp/SASM/program.o:/tmp/SASM/program.asm:9:_start' /usr/lib/gcc/x86_64-unknown-linux-gnu/5.3.0/../../../../lib/crt1.o:(.text+0x0): first defined here /usr/lib/gcc/x86_64-unknown-linux-gnu/5.3.0/../../../../lib/crt1.o: In function_start'的多重定义: (.text+0x20): 未定义的对“main”的引用 collect2: Fehler: ld gab 1 饰演 Ende-Status zurück [14:46:07] 在调试之前,您需要构建程序。

因为它不起作用,所以我想 SASM IDE 和 NASM 之间肯定有区别(通常我认为 SASM 或多或少只是 NASM 的 GUI)。

在 SASM 中编译程序必须满足什么要求?

【问题讨论】:

  • SASM 似乎说你应该使用 CMAIN 宏作为入口点,而不是 _start。

标签: assembly nasm


【解决方案1】:

好的,它适用于以下修改。 (包括在第一行并将 _start 更改为 CMAIN)

%include "io64.inc"

      section .data
hello   db "Hello World!",0xa
len equ $-hello

    section .text
    global  CMAIN

CMAIN:
    mov eax, 4
    mov ebx, 1
    mov ecx, hello
    mov edx, len
    int 80h

    mov eax, 1 ; exit(0)
    mov ebx, 0
    int 80h 

但对我来说更重要的问题是,SASM 和 NASM 之间有什么区别?在我看来,这不再是 NASM 支持,因为原生 NASM 程序未经修改就无法执行。或者是否有执行此类程序的设置?

【讨论】:

  • 还是nasm代码,区别在于链接。显然 sasm 与 C 库链接(您也许可以在某处将其关闭)。
  • 你是对的。在设置中,您可以更改程序集选项和链接器选项。输入汇编选项:“-f elf64 $SOURCE$”和链接选项“-o $PROGRAM$ $PROGRAM.OBJ$”,它将编译。
猜你喜欢
  • 2011-03-19
  • 1970-01-01
  • 2017-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-06
相关资源
最近更新 更多