Как преобразовать программу сборки emu 8086 в ассемблер linux - PullRequest
0 голосов
/ 10 апреля 2019

Я пишу код для преобразования шестнадцатеричного (AF) в десятичный в сборке.Мне удалось написать на 8086 эму, но мне нужно для Linux.Мне нужна помощь.

Код работает абсолютно нормально на эмуляторе 8086 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

1 Ответ

1 голос
/ 10 апреля 2019

Чтобы выполнить такое преобразование, вам нужно учесть две вещи:

  1. Ваш код сегментирован на 16-битный ассемблерный код.Linux не использует сегментированный 16-битный код, но либо плоский 32-битный, либо 64-битный код.

    «Плоский» означает, что селекторы (cs, ds, es, ss которые не являются «сегментными» регистрами, но являются «селекторами» в 32-битном режиме), имеют предварительно определенное значение, которое не должно изменяться.

    В 32-битном режиме инструкции ЦП (и, следовательно, инструкции ассемблера)) немного отличаются от 16-битного режима.

  2. Прерывания зависят от среды.Например, int 21h - это прерывание MS-DOS, что означает, что int 21h доступен только в том случае, если используемая операционная система совместима с MS-DOS или если вы используете какое-либо программное обеспечение (например, «8086 emu»), которое эмулирует MS-DOS..

    x86 Linux использует int 80h в 32-битных программах для вызова функций операционной системы.К сожалению, многие довольно «удобные» функции int 21h отсутствуют в Linux.В качестве примера можно привести ввод с клавиатуры:

    Если вам не нужно поведение по умолчанию (полные строки читаются с помощью echo; программа может прочитать первый символ строки после ввода полной строки), выПридется отправить в систему так называемый ioctl() -код ...

    И, конечно, синтаксис системных вызовов Linux отличается от синтаксиса MS-DOS: Функция EAX=9 из int 80h (связать файл на диске) - это совершенно другая функция, чем AH=9 из int 21h (вывести строку на экран).

Вы отметили свой вопрос с помощьютег att.Однако существуют также ассемблеры для Linux, которые могут собирать код сборки в стиле intel.

...