LINUX.ORG.RU

gas под dos

 , , , ,


1

1

Вот такой незамысловатый код на nasm

use16 
bits 16
org 0x100

segment .data 
    hello: db 'hello, world','$' 

segment .text 
    mov dx,hello 
    mov ax,0900h 
    int 21h 
    mov ax,4c00h 
    int 21h
компилирую на linux машине так:
nasm a.asm -o a.com -f bin
В dosbox отлично запускается, принтует и выходит.

Пытаюсь сделать аналогичное на gas

.code16

.globl _start

_start:
    movw $hello, %dx
    movb $0x09,  %ah
    int  $0x21
    movb $0x4c,  %ah
    int  $0x21

    hello: .ascii "Hello, world!$"
собираю так (под linux)
[actics@x120e dos]$ as -march=i386 -mtune=i8086 --32  gas.asm -o gas.o
[actics@x120e dos]$ ld -m i386linux -Ttext 0x100 -nostdlib --oformat binary gas.o -o gas.com
Запущенное в досе принтует много лишнего, приходится одну строчку заменять так:
movw $0x100 +  hello - _start, %dx
Каким образо можно скомпилировать gas код аналогично коду на nasm?


Простой disasm:

objdump -D -b binary -m i8086 <file>
и сравнивать выхлоп. (Да, метод тупой, но для начала хватит.)

beastie ★★★★★
()
Последнее исправление: beastie (всего исправлений: 1)
Ответ на: комментарий от beastie

Смотреть ещё тут: http://www.dim13.org/cgi-bin/cvsweb/src/reboot/ → мелкая безделушка давно забытых лет, но! reboot.asm и reboot.S суть одно и тоже ­— первое TASM, второе AT&T. (ну и правильный Makefile в придачу)

Disclamer: я к асму уже лет десять не прикасался.

beastie ★★★★★
()
Ответ на: комментарий от anonymous

Линукс тут при чём?

При том, что тут идет речь про GNU Binutils которые используются в том числе и для сборки ядра Linux

SZT ★★★★★
()

Я использовал yasm,

[bits 16]

extern _main

global _start
_start:
    jmp _main
...
asm(".code16");
#define asmlinkage __attribute__((regparm(0)))
asmlinkage void Test(void);
asmlinkage void asmHLT(void);
void _main(void) {
...
}
Сборка:
yasm -f bin -o module1.bin module1.asm
yasm -f elf -o module2.o module2.asm
gcc --std=gnu99 -Os -Wall -o program.bin -ffreestanding -fno-stack-protector program.c
ld -o program1.bin -Ttext 0x8000 --oformat binary module2.o program.o
Правда, это не MS DOS. Для ДОСа надо использовать
yasm -f help:
    dbg         Trace of all info passed to object format module
    bin         Flat format binary
>>  dosexe      DOS .EXE format binary
    elf         ELF
    elf32       ELF (32-bit)
    elf64       ELF (64-bit)
    coff        COFF (DJGPP)
    macho       Mac OS X ABI Mach-O File Format
    macho32     Mac OS X ABI Mach-O File Format (32-bit)
    macho64     Mac OS X ABI Mach-O File Format (64-bit)
    rdf         Relocatable Dynamic Object File Format (RDOFF) v2.0
    win32       Win32
    win64       Win64
    x64         Win64
    xdf         Extended Dynamic Object

pacify ★★★★★
()

Попробуй так:

$ cat ldscript 
OUTPUT_ARCH(i386)
SECTIONS
{
  .text 0x100 : AT ( 0 ) {
    *(.text)
  }
}

$ ld -T ldscript --oformat binary gas.o -o gas.com

Deleted
()

Есть еще as86 но его сейчас почти никто не использует. http://linux.die.net/man/1/as86

Немного документации http://www.tldp.org/HOWTO/Assembly-HOWTO/gas.html

Binutils (2.9.1.0.25+) now fully support 16-bit mode (registers and addressing) on i386 PCs. Use .code16 and .code32 to switch between assembly modes.

Also, a neat trick used by several people (including the oskit authors) is to force GCC to produce code for 16-bit real mode, using an inline assembly statement asm(".code16\n"). GCC will still emit only 32-bit addressing modes, but GAS will insert proper 32-bit prefixes for them.

SZT ★★★★★
()
Ответ на: комментарий от Deleted

Да, через такой ldscript для COM файлов нормально работает, только как делать досовский EXE header (MZ) ? Не вручную же его раз вбивать?

SZT ★★★★★
()
Ответ на: комментарий от Deleted

Спасибо, как раз думал над сабжем.

actics
() автор топика
Ответ на: комментарий от luke

Binutils (2.9.1.0.25+) now fully support 16-bit mode (registers and addressing) on i386 PCs. Use .code16 and .code32 to switch between assembly modes.

Also, a neat trick used by several people (including the oskit authors) is to force GCC to produce code for 16-bit real mode, using an inline assembly statement asm(«.code16\n»). GCC will still emit only 32-bit addressing modes, but GAS will insert proper 32-bit prefixes for them.

actics
() автор топика
Ответ на: комментарий от Deleted

Спасибо! На знаю, его ли это честь или нет, но у меня заработал следующий код, как по заказу:

.code16

.org 0x100

.section .data
    hello: .ascii "Hello, world!$"

.section .text
    movw $hello, %dx
    movb $0x09,  %ah
    int  $0x21
    movb $0x4c,  %ah
    int  $0x21

сборка
[actics@x120e dos]$ as -march=i386 -mtune=i8086 --32  gas.S -o gas.o
[actics@x120e dos]$ ld -T ldscrpt --oformat binary gas.o -o gas.com
Огромное спасибо всем откликнувшимся, но боюсь это только начало :)

actics
() автор топика
Ответ на: комментарий от actics

Спасибо, но мне нужен gas или nasm в крайнем случаи :)

yasm поддерживает gas и nasm синтаксис. http://linux.die.net/man/1/yasm

Yasm currently supports the x86 and AMD64 instruction sets, accepts NASM and GAS assembler syntaxes, outputs binary, ELF32, ELF64, COFF, Win32, and Win64 object formats, and generates source debugging information in STABS, DWARF 2, and CodeView 8 formats.

SZT ★★★★★
()
Ответ на: комментарий от beastie

Можно ещё вопрос по синтаксису? Почему в моем коде из первого поста оябзательно писать movw hello, %dx, а не movw $hello, %dx ? В чем суть $ ?

actics
() автор топика
Ответ на: комментарий от actics

http://simon.baymoo.org/universe/tools/symset/symset.txt ← 2.1.4.2.1 Immediate indirect addressing mode

С долларом — константа, без доллара «поинтр». Т.е. в твоём случае $hello → адресс лейбла hello, а просто hello → значение байта по адрессу лейбла hello.

beastie ★★★★★
()
Ответ на: комментарий от actics
movw hello, %dx

Загрузит в регистр два байтика, находящийхся по тому адресу

movw $hello, %dx
Загрузит в регистр адрес этой самой метки. Вот, смотри пример

.code16

.globl _start

_start:
    movw hello_ptr, %dx
    movb $0x09,  %ah
    int  $0x21
    movb $0x4c,  %ah
    int  $0x21

    hello: .ascii "Hello, world!$"

    hello_ptr: .word hello

Если есть вопросы, мой jabber j123123@jabber.ru
SZT ★★★★★
()
Ответ на: комментарий от luke

Вообще-то GNU уже давно положили болт на DOS и 16 бит.

не знаю как дос, а вот для grub 16 бит может пригодится.

dimon555 ★★★★★
()
9 июня 2013 г.
Ответ на: комментарий от luke

16 бит точно нет, как же GRUB, LILO, Syslinux, после включения проц оказываеться в реальном режиме, следовательно заргузчики работают тоже в реальном, только потом переключаються в защищенный.

ilya08
()
Ответ на: комментарий от ilya08

много загрузчиков нужно будет переписывать под уефи. Эти загрузчики не будут работать на обычних биосах.

ilya08
()
Ответ на: комментарий от actics

я еще не видел, может потому что я жыву в Украине? Хотя у меня есть знакомый, у котого может быть материнка с уефи.

ilya08
()
Ответ на: комментарий от actics

биос не умер. начиная примерно с 2009 идет с поддержкой uefi. Режим legacy(csm) будет оставаться очень долго, так что упоротые идиоты могут сполна наслаждаться сегментами и ah al и в будущем.

parrto
()
Ответ на: комментарий от ilya08

И каково там, в 90ых?) У кого сейчас ноут не возьму в руки, везде уефи.

actics
() автор топика
Последнее исправление: actics (всего исправлений: 1)
Ответ на: комментарий от parrto

а я имел ввиду то, что в современных тачках эти регистры никуда не делись, ибо они удобны в работе. Хотя, конечно, возможно, что на уровне микропрограммы их и не существует, я не знаю архитектурные подробности. Мне кажется, что к этим областям должен быть аппаратный доступ.

actics
() автор топика
Последнее исправление: actics (всего исправлений: 1)
Ответ на: комментарий от parrto

сейчас специально скомпилил movb $5, &al как 32 битный код, выполняющийся в protected mode. Скомпилировалось, заработало.

ilya08
()
Ответ на: комментарий от ilya08

да? значит я что-то попутал, в 64-битном режиме их нет. И таки 32-бита устарели. В магазинах видел нетбуки - на всех 64-битная спермерочка была. Было года 2 назад.

parrto
()
Ответ на: комментарий от parrto

пруф:

[actics@x120e ~]$ cat a.S
.section .text
.globl _start
_start:
    mov $0x3c, %al
    mov $0x00, %rdi
    syscall
[actics@x120e ~]$ as a.S -o a.o
[actics@x120e ~]$ ld -m elf_x86_64 a.o -o a
[actics@x120e ~]$ ./a
[actics@x120e ~]$ objdump -D a

a:     формат файла elf64-x86-64


Дизассемблирование раздела .text:

0000000000400078 <_start>:
  400078:	b0 3c                	mov    $0x3c,%al
  40007a:	48 c7 c7 00 00 00 00 	mov    $0x0,%rdi
  400081:	0f 05                	syscall 

actics
() автор топика
Последнее исправление: actics (всего исправлений: 2)
Ответ на: комментарий от actics

да похоже на правду, а я напутал. но не совсем. Параграф 3.4.1.1 intel developer manual,

Byte Registers 
Without REX 
AL, BL, CL, DL, AH, BH, CH, DH 
With REX
AL, BL, CL, DL, DIL, SIL, BPL, SPL, R8L - R15L
h-регистры не очень вроде нужны, да. Еще видим добавались байтовые регистры на основе старых. Проверь, если пишешь.

parrto
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.