gpt4 book ai didi

linux - 如何将 8086 emu 汇编程序转换为 linux 汇编兼容

转载 作者:太空宇宙 更新时间:2023-11-04 10:01:49 27 4
gpt4 key购买 nike

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

该代码在 8086 模拟器 n windows 上工作绝对正常。但我无法将其转换为 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

最佳答案

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

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

    “扁平化”意味着选择器(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 中并不存在。一个例子是键盘输入:

    如果你不想要默认行为(完整的行用回显读取;程序可以在输入完整行时读取一行的第一个字符),你必须发送一个所谓的 ioctl()-系统代码...

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

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

关于linux - 如何将 8086 emu 汇编程序转换为 linux 汇编兼容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55605062/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com