【发布时间】:2017-12-26 15:03:52
【问题描述】:
我注意到这个简单的 x86 Intel 汇编程序只能在 Linux 的 NASM 汇编程序上编译和运行。我很好奇我是否能够在 Linux 上使用 MASM 语法编译 Windows 汇编程序。 (在 NASM 中)如果没有,我会很好奇 NASM 和 MASM 语法之间存在哪些限制或差异。
我现在知道 NASM 文档中所述的两者之间的差异。 (可在http://www.nasm.us/doc/nasmdoc2.html#section-2.2 获得)但是,我仍然对 Windows 上的系统中断感到困惑。例如,Windows 是否要求以不同于基于 Unix 的操作系统的方式调用中断?
最后,我想知道是否有更有效的方法来达到同样的效果。
HelloWorld 汇编程序:
section .data ;Constant Data Section
userMsg db 'What is your name?' ;Request Name Input
lengthMsg equ $-userMsg ;Set length of request
returnMsg db 'Hello there, ' ;Return Message
lengthRet equ $-returnMsg ;Set length of returned message
section .bss
number resb 5
section .text
global _start
_start:
mov eax, 4 ;Print first message to screen
mov ebx, 1
mov ecx, userMsg
mov edx, lengthMsg
int 80h
mov eax, 3
mov ebx, 2
mov ecx, number
mov edx, 5
int 80h
mov eax, 4
mov ebx, 1
mov ecx, returnMsg
mov edx, lengthRet
int 80h
mov eax, 4
mov ebx, 1
mov ecx, number
mov edx, 5
int 80h
mov eax, 1
mov ebx, 0
int 80h
这些是组装文件时显示的错误。
Microsoft (R) Macro Assembler Version 6.14.8444
Copyright (C) Microsoft Corp 1981-1997. All rights reserved.
Assembling: C:\Projects\theapp.asm
C:\Projects\theapp.asm(1) : error A2008: syntax error : section
C:\Projects\theapp.asm(2) : error A2034: must be in segment block
C:\Projects\theapp.asm(3) : error A2034: must be in segment block
C:\Projects\theapp.asm(5) : error A2034: must be in segment block
C:\Projects\theapp.asm(6) : error A2034: must be in segment block
C:\Projects\theapp.asm(8) : error A2008: syntax error : section
C:\Projects\theapp.asm(9) : error A2008: syntax error : number
C:\Projects\theapp.asm(11) : error A2008: syntax error : section
C:\Projects\theapp.asm(12) : error A2008: syntax error : global
C:\Projects\theapp.asm(15) : error A2034: must be in segment block
C:\Projects\theapp.asm(16) : error A2085: instruction or register not accepted in current CPU mode
C:\Projects\theapp.asm(17) : error A2085: instruction or register not accepted in current CPU mode
C:\Projects\theapp.asm(18) : error A2085: instruction or register not accepted in current CPU mode
C:\Projects\theapp.asm(19) : error A2085: instruction or register not accepted in current CPU mode
C:\Projects\theapp.asm(20) : error A2034: must be in segment block
C:\Projects\theapp.asm(22) : error A2085: instruction or register not accepted in current CPU mode
C:\Projects\theapp.asm(23) : error A2085: instruction or register not accepted in current CPU mode
C:\Projects\theapp.asm(24) : error A2085: instruction or register not accepted in current CPU mode
C:\Projects\theapp.asm(25) : error A2085: instruction or register not accepted in current CPU mode
C:\Projects\theapp.asm(26) : error A2034: must be in segment block
C:\Projects\theapp.asm(28) : error A2085: instruction or register not accepted in current CPU mode
C:\Projects\theapp.asm(29) : error A2085: instruction or register not accepted in current CPU mode
C:\Projects\theapp.asm(30) : error A2085: instruction or register not accepted in current CPU mode
C:\Projects\theapp.asm(31) : error A2085: instruction or register not accepted in current CPU mode
C:\Projects\theapp.asm(32) : error A2034: must be in segment block
C:\Projects\theapp.asm(34) : error A2085: instruction or register not accepted in current CPU mode
C:\Projects\theapp.asm(35) : error A2085: instruction or register not accepted in current CPU mode
C:\Projects\theapp.asm(36) : error A2085: instruction or register not accepted in current CPU mode
C:\Projects\theapp.asm(37) : error A2085: instruction or register not accepted in current CPU mode
C:\Projects\theapp.asm(38) : error A2034: must be in segment block
C:\Projects\theapp.asm(40) : error A2085: instruction or register not accepted in current CPU mode
C:\Projects\theapp.asm(41) : error A2085: instruction or register not accepted in current CPU mode
C:\Projects\theapp.asm(42) : error A2034: must be in segment block
C:\Projects\theapp.asm(45) : error A2088: END directive required at end of file
_
Assembly Error
Press any key to continue . . .
【问题讨论】:
-
您的代码是 NASM,而不是 MASM。您显示的代码也是 Linux 特定的(
int 80h系统调用和数字),即使您设法组装它也不能与 Windows 一起使用。您正在使用的在线链接也使用 NASM 并且在 Linux 后端上运行,这就是它起作用的原因。 -
在线编译器是 NASM,您正在尝试使用 MASM。它们非常不同
-
没什么不同,实际上只需要进行一些更改(从经验丰富的 x86 asm 程序员的角度来看)就可以在 MASM 中编译,但它仍然无法在 Windows 下工作,所以没有意义在这样做。 .. 任何特定于平台的东西,比如操作系统/服务调用,都不能在不同的平台上工作,但是 CPU 指令、你编写算术和算法的方式等等......都是一样的。因此,如果您有 64b 的 linux 教程,只需在该在线 IDE 上进行操作,但该 IDE 没有任何可用的调试器,这是一个巨大的缺点。所以你甚至可以考虑在 VM 中安装一些 linux。