AT&T構文を使用して、32ビットLinuxアセンブリに移植したい80836DOSアセンブリのコードを見つけました。
いくつかの違いを説明しているが、レジスターについてのみ説明しているサイトを見つけました。元:
- 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
私はそれを思います:
- 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では16時間?20時間?21時間?ああ、それでもint 20hは割り込みおよび値(mov dl、20h)として機能しますか?とても紛らわしい。
誰かが私を助けることができますか?
@EDITこのように変換しましたが、セグメンテーション違反エラーが発生しました。私はそれが割り込みについてであるとほぼ確信しています。
.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
誰?