执行汇编代码时控制台上的垃圾字符

Posted

技术标签:

【中文标题】执行汇编代码时控制台上的垃圾字符【英文标题】:Junk characters on console when execute assembly code 【发布时间】:2011-09-22 14:40:42 【问题描述】:

x86 汇编编程初学者。我有一个简单的 asm 文件,我使用 nasm 版本组装 - NASM 版本 2.10rc6 于 2011 年 6 月 6 日编译,用于 windows(我的 windows 是 Windowa-7 64 位)。 NASM 是从here (nasm-2.10rc6-win32.zip) 下载的。

ORG 100
USE16

    mov ah, 09
    mov dx, msg
    int 21h

    mov ah, 01
    int 21h
    mov ah, 4ch
    int 21h

    msg db 'Hello assembly', 0Ah, '$'

然后我使用命令组装 -

nasm -f bin hello.asm -o hello.com

然后我使用 Dosbox(用于 64 位操作系统 Windows-7 的 Dos 模拟器)运行生成的可执行文件 hello.com。 当它运行时,控制台上的输出输出有我的字符串'Hello assembly'加上一些垃圾字符/控制字符在它之前打印,如下所示:

这是什么原因。代码有什么问题吗?

我需要做什么来解决这个问题?

编辑:当我尝试为 nasm 提供选项 -f 以生成特定类型的可执行输出时,例如Win32 或 Win64 输出我不断收到错误提示:

nasm -f win64 hello.asm -o hello.com

hello.asm:1: error: parser: instruction expected

它在期待什么?如何使用 nasm 生成 win32/win64 可执行文件?或者就此而言,nasm 表示它支持的任何其他可执行文件(如 elf32/coff)?

【问题讨论】:

【参考方案1】:

问题是:

ORG 100

应该是:

ORG 100h

二进制文件是.COM,所以无论如何都会在100h 加载和运行;该错误意味着汇编程序为msg 计算的地址将比应有的早156 个字节,因此会产生额外的垃圾。

ORG 指令仅适用于 bin 格式。其他可执行格式具有节(或段)。 (参见NASM manual 的"Output Formats" 部分。)

【讨论】:

以上是关于执行汇编代码时控制台上的垃圾字符的主要内容,如果未能解决你的问题,请参考以下文章

在 .NET 的控制台上打印 ASCII 0x07 字符时,这会导致系统发出蜂鸣声

是否可以使用 MinGW 在 Windows XP 控制台上获取 unicode 字符?

在系统控制台上找不到 jhipster?

使用 masm 将简单字符串写入控制台(汇编代码)

我想在控制台上输出二维码?

如何在 Laravel 的控制台上打印消息?