Assembly 汇编编程:NASM与MASM代码

Assembly 汇编编程:NASM与MASM代码,assembly,x86,nasm,masm,Assembly,X86,Nasm,Masm,我刚开始学习汇编编程。到目前为止,我知道NASM是linux最好的汇编程序。以及它的32位汇编程序 另一方面,MASM是一个DOS汇编程序及其16位 现在我想知道如何从16位x86 DOS汇编代码移植到32位x86 Linux汇编代码或32位x86 Windows汇编代码 提前谢谢 NASM可以处理从8位到64位的x86,不用担心。NASM是一个很好的全方位汇编程序 他们都使用英特尔风格的汇编代码,在我看来,这比AT&T风格的汇编代码要好,你应该做得很好 他们是汇编器,只要你理解你调用的中断,他

我刚开始学习汇编编程。到目前为止,我知道NASM是linux最好的汇编程序。以及它的32位汇编程序

另一方面,MASM是一个DOS汇编程序及其16位

现在我想知道如何从16位x86 DOS汇编代码移植到32位x86 Linux汇编代码或32位x86 Windows汇编代码


提前谢谢

NASM可以处理从8位到64位的x86,不用担心。NASM是一个很好的全方位汇编程序

他们都使用英特尔风格的汇编代码,在我看来,这比AT&T风格的汇编代码要好,你应该做得很好

他们是汇编器,只要你理解你调用的中断,他们就会接受你的代码,把它转换成二进制,然后愉快地把它发送出去执行

哦,是的,要生成一个dos可执行文件,请将ORG放置在您想要的入口点上方100h,这就是为什么dos对汇编程序员很好的原因

编辑:这只是其中一个原因,其他的原因是dos是基于中断的,所以知道参数的去向,以及它们被允许进行相对简单的系统调用


PE格式正是您想要寻找的,我认为NASM中还有更多的手工工作要做,以使其在windows上正常工作…

MASM不仅仅是16位。您还可以获得32位assember MASM:


DOS程序集和Linux程序集完全不同。没有自动化的方法可以到达港口。您必须为每个组件编写单独的代码,因为组件最接近金属。

NASM不是“32位”:。此外,MASM不是“16位”:“从MASM 8.0开始,汇编程序有两个版本-一个用于16位和32位汇编源代码”。您的问题不清楚。代码是否为16位/32位/64位只是影响移植的一个因素,另一个因素是操作系统。您的意思是如何从16位x86 DOS汇编代码移植到32位x86 Linux汇编代码或32位x86 Windows汇编代码或其他代码?请指定。是的,我想知道如何从16位x86 DOS汇编代码移植到32位x86 Linux汇编代码或32位x86 Windows汇编代码。相关:,“因为系统调用API完全不同”将是说明最后一点的更具体方式。如果同一个API使用的是不同的ABI,那么移植工作量可能会小得多,而且其中一些可能是自动化的。当然,接近金属意味着移植到不同的API/ABI需要更多的工作,但是对于Linux和DOS,C程序需要进行重大重写。@Madhur,你推荐MASM还是NASM?Linux 32位系统调用可以使用
int 0x80
进行。(但是在
vdso
中调用
sysenter
代码的用户空间端更快)。除eax(返回值)外,所有寄存器均被保留。ABI和DOS一样“基于中断”,如果你是这个意思的话。64位也是类似的:使用
syscall
,它保留除
rcx
r11
之外的所有寄存器以及返回值。Windows代码OTOH不应该直接使用内核系统调用,而是通过对DLL的函数调用使用win32 API。所以,是的,你被函数调用ABI卡住了。