- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在编写代码以在汇编中将十六进制 (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
最佳答案
要进行这样的转换,您必须考虑两件事:
您的代码是分段的 16 位汇编代码。 Linux 不使用分段的 16 位代码,而是使用扁平的 32 位或 64 位代码。
“扁平化”意味着选择器(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 中并不存在。一个例子是键盘输入:
如果你不想要默认行为(完整的行用回显读取;程序可以在输入完整行时读取一行的第一个字符),你必须发送一个所谓的 ioctl()
-系统代码...
当然,Linux 系统调用的语法与 MS-DOS 的不同:int 80h
的函数 EAX=9
(链接磁盘上的文件)是与 int 21h
的 AH=9
完全不同的函数(在屏幕上打印一个字符串)。
您已使用标签 att
标记了您的问题。然而,也有适用于 Linux 的汇编程序可以汇编 intel
风格的汇编代码。
关于linux - 如何将 8086 emu 汇编程序转换为 linux 汇编兼容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55605062/
我是一名优秀的程序员,十分优秀!