【发布时间】:2013-03-24 10:05:30
【问题描述】:
我在 80836 DOS 程序集中找到了我想使用 AT&T 语法移植到 32 位 Linux 程序集的代码。
我发现网站解释了一些差异,但仅与寄存器有关。例如:
- cmp al, 'A' -> cmp 'A', %al
所以我在转换以下代码时遇到了问题:
input:
mov ah, 00h
int 16h
cmp ah, 1ch
je exit
sub al, 30h
sub al, 37h
sub al, 57h
mov ah, 02h
mov dl, al
int 21h
mov dl, 20h
int 21h
exit:
int 20h
我正在转换this code
我认为:
- sub al, 57h ---> sub $0x57, %al 和 ETC(不确定)
最糟糕的问题是中断,因为在 AT&T 汇编中它就像:
SYSCALL = 0X80
SYSEXIT = 1
EXIT_SUCCESS = 0
SYSREAD = 3
SYSWRITE = 4
STDIN = 0
STDOUT = 1
在 DOS16 中,16h? 20 小时? 21 小时?哦,伙计,即使这样 int 20h 也充当中断和值(mov dl,20h)?如此混乱。
有人可以帮我吗?
@编辑 我像这样转换它,但出现分段错误错误。我几乎可以肯定这是关于中断..
.data
.text
.global _start
_start:
input:
movb $0x0,%ah
int $0x16
cmpb $0x1c,%ah
je exit
number:
cmpb $'0', %al
jb input
cmpb $'9', %al
ja uppercase
subb $0x30,%al
call process
jmp input
uppercase:
cmpb $'A', %al
jb input
cmpb $'F', %al
ja lowercase
subb $0x37,%al
call process
jmp input
lowercase:
cmpb $'a', %al
jb input
cmpb $'f', %al
ja input
subb $0x57,%al
call process
jmp input
loop input
process:
movb $4,%ch
movb $3,%cl
movb %al,%bl
convert:
movb %bl,%al
rorb %cl,%al
andb $01,%al
addb $0x30,%al
movb $0x2,%ah
movb %al,%dl
int $0x21
decb %cl
decb %ch
jnz convert
movb $0x20,%dl
int $0x21
ret
exit:
int $0x20
有人吗?
【问题讨论】:
-
如果您只想将 16 位 Intel 汇编语法转换为 16 位 AT&T 汇编语法,
int 21h将变为int $0x21。你所说的“AT&T 程序集”是 Linux 32 位系统调用的一些功能。我很确定没有从 16 位 DOS 程序集到 32 位 Linux 程序集的转换器。为此,您需要学习 Linux 32 位汇编。您还在阅读带有 BIOS 键盘中断int 16h的键盘。在 Linux 中,您需要为此使用 Linux 系统调用 (int 0x80)。那么,你的目标是什么? 1. 仅将语法从 Intel 转换为 AT&T(不移植到 Linux),或 2. 将 DOS 代码移植到 Linux。 -
当然是使用 linux 系统调用的端口!我希望这是 ubuntu 中的工作程序。我更改了出口,很容易将 $1 更改为 %eax 和 int 0x80,但我在它之前的行(mov dl,20h int 21h)和 intput 遇到了大问题。我不知道如何将其更改为工作代码
标签: linux assembly x86 dos att