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

问题描述 投票:0回答:1

我正在编写一个代码,用于在程序集中将十六进制(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
投票

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

  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中并不存在。键盘输入就是一个例子: 如果您不想使用默认行为(使用echo读取完整行;程序可以在键入完整行时读取行的第一个字符),则必须发送所谓的ioctl()代码系统... 当然,Linux系统调用的语法与MS-DOS的语法不同:EAX=9的函数int 80h(链接磁盘上的文件)是与AH=9int 21h完全不同的函数(在屏幕上打印一个字符串)。

您已使用标签att标记了您的问题。然而,还有用于Linux的汇编程序可以组装intel样式的汇编代码。

© www.soinside.com 2019 - 2024. All rights reserved.