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

时间:2019-04-10 05:06:11

标签: linux assembly compiler-errors att emu8086

我正在编写将十六进制(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

1 个答案:

答案 0 :(得分:1)

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

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

    “平面”表示在32位模式下不是“段”寄存器而是“选择器”的选择器(csdsesss )具有一个不应更改的预定义值。

    在32位模式下,CPU指令(以及汇编程序指令)与16位模式有些不同。

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

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

    如果您不希望使用默认行为(用echo读取完整行;键入完整行后程序可以读取行的第一个字符),则必须发送一个所谓的{ {1}}-编码到系统...

    当然,Linux系统调用的语法与MS-DOS语法不同:ioctl()中的功能EAX=9(链接磁盘上的文件)与{{1} },共int 80h(在屏幕上打印一个字符串)。

您已使用标签AH=9标记了您的问题。但是,还有用于Linux的汇编器,可以汇编int 21h样式的汇编代码。