我正在编写将十六进制(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
答案 0 :(得分:1)
要进行这种转换,您必须考虑两件事:
您的代码是分段的16位汇编代码。 Linux不使用分段的16位代码,而是使用固定的32位或64位代码。
“平面”表示在32位模式下不是“段”寄存器而是“选择器”的选择器(cs
,ds
,es
,ss
)具有一个不应更改的预定义值。
在32位模式下,CPU指令(以及汇编程序指令)与16位模式有些不同。
中断与环境有关。例如,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
样式的汇编代码。