我需要做些什么来使这个16位汇编成32位?

时间:2011-09-11 12:56:53

标签: debugging assembly 32-bit 16-bit

我问了一个关于汇编语言here的问题。我觉得很难使用16位程序。所以现在我想把它改成32位。这是我尝试的第一个程序的代码:

[org 0x0100]
mov ax, 5
mov bx, 10
add ax, bx
mov bx, 15
add ax, bx 
mov ax, 0x4c00
int 0x21

我把它命名为ex01.asm。我用NASM制作了一个COM文件。命令是

nasm ex01.asm -o ex01.com -l ex01.lst

但是我不能在Ollydbg中使用创建的COM文件。所以如果我想改变这个程序在win xp或win 7中工作,那么我可以使用Ollydbg,我必须做些什么改变?为什么? 我的想法:

  1. 我想我必须改变ORG 0x100。它特定于我认为的COM文件。所以我想知道,我应该在这里做些什么改变? COM文件不能在win XP和win 7上运行吗?我可以制作EXE文件而不是COM文件吗?我只是想了解这个程序。

  2. 我必须更改第二行,因为它用于告诉DOS程序已完成。我必须做些什么改变?为什么?

  3. 我忘了为什么要使用最后一行?任何人都可以告诉我,如果需要替代它吗?

1 个答案:

答案 0 :(得分:1)

我认为,NASM无法直接生成EXE。 您需要将ASM编译到目标文件中,然后链接到某个链接器(例如,来自MinGW包的ld.exe)。

在代码中,您需要创建过程而不是内联代码(WinMain)。

代码:

mov ax, 0x4c00 
int 0x21

将替换为从procedure返回(或从kernel32.dll调用函数)。

这可以帮助(一点点): http://en.kioskea.net/faq/1559-compiling-an-assembly-program-with-nasm

您还可以查看能够直接构建exe的FASM http://flatassembler.net/