我正在编写一个代码,用于在程序集中将十六进制(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
要进行这样的转换,您必须考虑两件事:
cs
,ds
,es
,ss
不是“段”寄存器而是32位模式中的“选择器”)具有不应更改的预定义值。
在32位模式下,CPU指令(以及汇编指令)与16位模式略有不同。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=9
的int 21h
完全不同的函数(在屏幕上打印一个字符串)。您已使用标签att
标记了您的问题。然而,还有用于Linux的汇编程序可以组装intel
样式的汇编代码。