【问题标题】:can't execute assembly program无法执行汇编程序
【发布时间】:2017-01-29 06:43:16
【问题描述】:

我今天决定学习汇编,因为它似乎是一个非常强大的工具,但我不知道从哪里开始学习它,所以我搜索了它并找到了这个: https://www.tutorialspoint.com/assembly_programming

它告诉我要安装 NASM 和 MinGW 用于编译和链接,所以我下载并安装了它并确保它们都正常工作。

我复制了给定的代码

section .text
   global _start     ;must be declared for linker (ld)

_start:             ;tells linker entry point
   mov  edx,len     ;message length
   mov  ecx,msg     ;message to write
   mov  ebx,1       ;file descriptor (stdout)
   mov  eax,4       ;system call number (sys_write)
   int  0x80        ;call kernel

   mov  eax,1       ;system call number (sys_exit)
   int  0x80        ;call kernel

section .data
msg db 'Hello, world!', 0xa  ;string to be printed
len equ $ - msg     ;length of the string

并将其粘贴到一个名为“hello.asm”的空文档中并通过编写进行编译

nasm -f elf hello.asm
(later nasm -f win32 hello.asm)

之后

ld hello.o -o hello.exe
(later ld hello.obj -o hello.exe)

它两次都成功创建了一个.exe文件,但是当我尝试执行它时,它只打开了windows命令提示符并打开了一个新窗口,上面写着“hello.exe不再工作”。

我知道这不会输出任何东西,但它至少不应该运行吗?

我做错了什么?

使用:

  • Windows 7 专业版 64 位
  • AMD FX 4350
  • nasm-2.12.02
  • MinGW

【问题讨论】:

  • 这是linux的教程,在windows上是不行的。
  • 所以程序集是操作系统特定的?
  • 不,但系统调用是 (int 0x80)

标签: windows assembly nasm x86-64


【解决方案1】:

您将需要一个不同的教程,因为用户 tkausl 指出本教程适用于 Linux x86_64 位。

对于 Windows,如果您愿意,您仍然可以使用 NASM 汇编程序和 MinGW,但您的代码会因为调用不同而看起来不同,并且还需要您使用外部库。

不过,我建议使用适用于 Windows 的 MASM,因为它是由 Microsoft 设计的,并且还包含在具有其他工具的 MASM32v8 包中。您可以从这里获取 MASM:http://www.masm32.com/

还有一个Windows Assembly的教程: https://www-s.acm.illinois.edu/sigwin/old/workshops/winasmtut.pdf

但是,如果您打算使用 NASM 汇编器,那么您可以参考 caffiend 在此处发布的答案: How to write hello world in assembler under Windows?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多