【问题标题】:How to convert an 8086 emu assembly program to linux assembly comaptible如何将 8086 emu 汇编程序转换为与 linux 汇编兼容的程序
【发布时间】:2023-04-08 05:15:01
【问题描述】:

我正在编写代码以在汇编中将十六进制 (A-F) 转换为十进制。我设法在 8086 emu 上写了它,但我需要它用于 linux。我需要帮助。

代码在 8086 模拟器 n 窗口上运行良好。但我无法将其转换为 Linux 语法。我对汇编的 Linux 语法不熟悉。

这是我的 8686 代码。

org 100h
.model small
.stack 100h
.data
msg1 db 'Enter a hex digit:$'
msg2 db 'In decimal it is:$'
.code
main proc
mov ax,@data
mov ds,ax
lea dx,msg1
mov ah,9
int 21h

mov ah,1
int 21h
mov bl,al
sub bl,17d ; convert to corrosponding hex value
mov ah,2
mov dl,0dh
int 21h
mov dl,0ah
int 21h
lea dx,msg2
mov ah,9
int 21h
mov dl,49d ;print 1 at first
mov ah,2
int 21h
mov dl,bl
mov ah,2 ; print next value of hex after 1
int 21h
main endp
end main
ret

【问题讨论】:

标签: linux assembly compiler-errors att emu8086


【解决方案1】:

要进行这样的转换,您必须考虑两件事:

  1. 您的代码是分段的 16 位汇编代码。 Linux 不使用分段的 16 位代码,而是使用平面 32 位或 64 位代码。

    “Flat”表示选择器(csdsesss,它们不是“段”寄存器,而是 32 位模式下的“选择器”)具有预定义的值,该值不应该改变。

    在 32 位模式下,CPU 指令(以及因此的汇编指令)与 16 位模式略有不同。

  2. 中断取决于环境。 int 21h 例如是一个 MS-DOS 中断,这意味着 int 21h 仅在使用的操作系统与 MS-DOS 兼容或您使用一些模拟 MS-DOS 的软件(例如“8086 emu”)时可用.

    x86 Linux 在 32 位程序中使用int 80h 来调用操作系统函数。不幸的是,int 21h 的许多非常“方便”的功能在 Linux 中不存在。一个例子是键盘输入:

    如果您不想要默认行为(使用 echo 读取完整的行;当输入完整的行时,程序可以读取行的第一个字符),您必须发送所谓的 @ 987654329@-系统代码...

    当然,Linux 系统调用的语法与 MS-DOS 的不同:int 80h 的函数 EAX=9(链接磁盘上的文件)与 int 21hAH=9 的函数完全不同(在屏幕上打印一个字符串)。

您已使用标签att 标记了您的问题。然而,也有适用于 Linux 的汇编器可以汇编 intel 风格的汇编代码。

【讨论】:

  • 马丁您好,感谢您的解释。然后我可以得到一些转换器,可以将此代码转换为 32 位架构,因为我根本不熟悉该架构。
  • @user3260225:不,没有工具可以自动从 16 位 DOS 代码移植到 32 位 Linux 代码。如果你想在 Linux 下运行 DOS 程序,你通常会使用 DOSBOX 之类的模拟器。如果你想要一个 Linux 程序,你会写一个 Linux 程序。但是,除了系统调用之外,16 位代码通常可以在 32 位模式下使用 16 位寄存器很好地组装。它通常效率较低,但您通常只需要移植系统调用,并且正如 Martin 所说,它们中的大多数没有 1:1 等效项。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-24
  • 2021-04-23
  • 2021-02-26
  • 2010-11-09
  • 2017-08-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多