【问题标题】:FASM HelloWorld .exe programFASM HelloWorld .exe 程序
【发布时间】:2010-11-13 20:34:59
【问题描述】:

我尝试在 FASM 上编写我的第一个 .exe 程序。当我使用 org 100h 时它工作正常,但我想编译 .exe 文件。当我用“format PE GUI 4.0”替换第一行并尝试编译它时,出现了错误:“value out of range”(行:mov dx,msg)。

ORG 100h      ;format PE GUI 4.0

mov dx,msg
mov ah,9h
int 21h

mov ah,10h
int 16h

int 21h

msg db "Hello World!$" 

我应该如何更改源代码?
---------------------------------------------- 答案是:

format mz
org 100h

mov edx,msg
mov ah,9h
int 21h

mov ah,10h
int 16h

mov ax,$4c01
int 21h

msg db "Hello World!$" 

【问题讨论】:

  • 我不是 fasm 方面的专家,但你试过movb吗?

标签: assembly exe fasm


【解决方案1】:

您的第一个版本是 COM 格式。它是一个 16 位实模式 FLAT 模型。 您的第二个版本是 DOS MZ 格式。它是一个 16 位实模式 SEGMENTED 模型。

分段模型使用“分段”来描述您的 DS(分段)和 DX(偏移)。所以首先你需要为你的数据和代码定义段,其次你需要正确指出你的数据段在哪里以及你的偏移量是多少,然后才能使用 int 21h,函数 9。

int 21h,函数 9 需要在分段模型中正确设置 DS:DX,以打印空终止字符串

format MZ
entry .code:start
segment .code
start:
mov ax, .data ; put data segment into ax
mov ds, ax    ; there, I setup the DS for you
mov dx, msg   ; now I give you the offset in DX. DS:DX now completed.
mov ah, 9h
int 21h
mov ah, 4ch
int 21h
segment .data
msg db 'Hello World', '$'

希望这可以帮助一些 FASM 新手。

【讨论】:

  • 一个以 $ 结尾的字符串,我会说?
【解决方案2】:

如果你想要DOS exe,你需要format mz

【讨论】:

  • 谢谢!格式 mz 帮我编译程序,但输出是:“[许多奇怪的字符]Hello World!”。好像味精的地址不正确
  • 如果文件的开头是:format mz org 100h mov dx,msg... 我得到 NTVDM.exe 崩溃。如果文件的开头是: format mz mov dx,msg... 我得到一个不正确的输出。
  • 哦,不。在这两种情况下(有或没有 org100h)我都会遇到 MTVDM.exe 不稳定崩溃。至少如果我保持 100h 输出是正确的。
  • 您没有设置 int 21h 函数。尝试使用 org 100hmov ax,$4c01 int $21h
【解决方案3】:

您可能想尝试改用lea(即lea dx, msg);这需要操作数的偏移量,并且可能更适合您想要的...

【讨论】:

  • 你写了什么? lea 应该作为指令而不是操作数...
  • FASM 是否支持 MASM/TASM "mov dx, offset msg" 样式?除非您需要 lea 的特殊功能,否则最好避免使用它。在旧处理器上速度较慢(我相信所有新处理器都有额外的硬件来提高速度)。
猜你喜欢
  • 2012-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-09
  • 1970-01-01
  • 2019-08-23
  • 1970-01-01
  • 2021-11-20
相关资源
最近更新 更多