【问题标题】:Using assembly language to print string variables使用汇编语言打印字符串变量
【发布时间】:2019-03-31 20:57:25
【问题描述】:

这对许多人来说可能听起来很普遍。我只需要帮助使用 Visual Studio 用汇编语言声明和打印字符串。我只是在尝试一些汇编代码,虽然我可以处理许多基于数学的东西。我无法处理与字符串相关的功能。

我正在尝试运行一些我在网上找到的代码。但是它显示了一些错误。我正在使用 Visual Studio Visualc++ 2013

main proc
 MOV AX, @DATA                ; initialize DS
 MOV DS, AX

 LEA DX, STRING_1             ; load & display the STRING_1  
 MOV AH, 9            
 INT 21H

错误 1 ​​错误 A2004:符号类型冲突 .asm 11 1 项目

【问题讨论】:

  • 您在使用某种 16 位仿真器吗?在 Windows 中,您不能使用 DOS 或 BIOS 软件中断(INT 指令)来执行 I/O。
  • @prl:确切地说:某些版本的 Windows——尤其是 64 位版本——没有内置的 DOS&BIOS 模拟器。

标签: windows visual-studio assembly


【解决方案1】:

我正在使用 Visual Studio Visual C++ 2013

...这可能意味着您正在创建一个 32 位或 64 位 Windows 程序。

但是,您发布的代码显然是 16 位代码。通常,您不能混合使用 16 位、32 位和 64 位代码。

用户“prl”和“rkhb”留下了两​​个cmets:

在 Windows 中,您不能使用 DOS 或 BIOS 软件中断 ...
...
确切地说:某些版本的 Windows

在 16 位 Windows 程序中,您同时使用了 .DLL 文件和 BIOS 和 MS-DOS 中断中的函数组合。 INT 21h 的函数AH=3Eh 用于关闭文件句柄。

但是,在 32 位和 64 位 Windows 程序中使用 INT 指令是不允许的。相反,.DLL 文件包含所有必要的函数(例如,CloseHandle,它在 32 位和 64 位程序中替换了 AH=3Eh, INT 21h)。

而且 16 位 Windows 程序永远无法访问控制台,因此函数 AH=9INT 21h 无法在 16 位 Windows 程序中运行,而只能在 MS-DOS 程序中运行。

我只是在尝试一些汇编代码,虽然我可以处理许多基于数学的东西。

你想做什么?

  • 出于性能原因在 32 位或 64 位程序中使用汇编代码?

    在这种情况下,您应该了解 16 位、32 位和 64 位 x86 汇编程序之间的区别,并以 32 位或 64 位汇编程序编写程序。您不能“直接”调用操作系统函数(例如字符串输出),但必须从 .DLL 文件中调用函数(只需使用 CALL 指令即可完成)。

  • 学习 16 位 x86 汇编?

    在这种情况下,您将需要一个 16 位编译器和一个 16 位汇编器来创建 MS-DOS 程序(因此 Visual Studio 2013 将无济于事)。如果您的计算机运行 Windows 7 或更新版本,您将需要一些 MS-DOS 模拟器或运行某些 DOS 操作系统的虚拟机,因为最近的 Windows 版本不支持运行 DOS 程序。

【讨论】:

    猜你喜欢
    • 2017-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-21
    • 1970-01-01
    相关资源
    最近更新 更多