Вопросы по as

Тема в разделе "WASM.UNIX", создана пользователем pluton, 30 дек 2007.

  1. pluton

    pluton New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2007
    Сообщения:
    66
    Адрес:
    Odessa
    привет всем!
    подскажите какой нибудь мануал по AT&T синтаксису (кроме этого http://security.opennet.ru/docs/RUS/gas/gas.html). у мня есть вопрос - как объявить массив 512 байт?
    пробовал m:.byte dup(512), m:.byte 512 dup(?) и ещё по-другому. в конце концов скомплилось так: m:.byte dup. только непонятен смысл этой записи.
    и ещё - как компилить проги под винду? есть такая прога:
    Код (Text):
    1. .text
    2. .globl main
    3. main:
    4.     pushl $msg
    5.     call puts
    6.     addl $0x4, %esp
    7.     ret
    8. .data
    9.     msg: .string "blah blah blah\0"
    у меня стоит mingw + binutils. компилю так:
    as -o prog.o prog.asm
    gcc -o prog.exe prog.o

    as прошёл нормально. вторая команда выдаёт:
    prog.o:fake:dntknw:.text+0x6): undefined reference to `puts'
    /mingw/lib/libmingw32.a(main.o):main.c:dntknw:.text+0x104): undefined reference to `_W
    inMain@16'
    collect2: ld returned 1 exit status

    под линуксом усё работает.
     
  2. creeper

    creeper New Member

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    132
    Из книги Programming From The Ground Up
    Код (Text):
    1. .section .bss
    2.  
    3. .lcomm buffer, 512
    Кстати, книгу можно спокойно скачать в интернете - не варез.
     
  3. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    Код (Text):
    1. .bss
    2. .skip 512, 0
     
  4. r90

    r90 New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2005
    Сообщения:
    898
    под линухом имена C-шные не манглятся. используй _puts, вместо puts -- должно заработать.
     
  5. pluton

    pluton New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2007
    Сообщения:
    66
    Адрес:
    Odessa
    creeper, спасибо. работает. насчёт книги, автор - Barlett J.? если можешь, кинь ссылку плиз.

    rei3er, спасибо. тоже работает :). а как обращаться к этому куску памяти?

    r90, спасибо. поставил _puts и поковырялся с линкером. вот так скомпилилось:
    ld -o prog.exe prog.o -L "/mingw/lib" -lmsvcrt
    теперь вопрос - можно ли использовать функции линукса? например, open(). или я слишком много хочу?
    prog.o:fake:dntknw:.text+0x15): undefined reference to `open'
    мож под cygwin сработает? какието пакеты нужно поставить?
     
  6. creeper

    creeper New Member

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    132
  7. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    Код (Text):
    1. movl .bss + 10, %eax
     
  8. pluton

    pluton New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2007
    Сообщения:
    66
    Адрес:
    Odessa
    creeper, спасибо за книгу
    rei3er, спасибо за объяснение

    ещё вопросики:
    как называется аналог sizeof?
    как объявить константу (типа EQU)?
    как объявить неинициализированную переменную (var1: .long ?) ?
     
  9. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    в GAS нет того, к чему он применяется
    никак
    либо пользоваться #define и компилировать GCC
    Код (Text):
    1. .skip 4
     
  10. creeper

    creeper New Member

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    132
    Все из той же книги.. Пример:
    Код (Text):
    1. .equ SYS_OPEN, 5
    2. .equ STDIN, 0
    3. ...
     
  11. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    creeper
    это не то
    тут идет определение символа, а не константы
    т. е в таблице символов будет создан соответствующий элемент
    хотя семантика использования (подстановка) сохраняется
     
  12. creeper

    creeper New Member

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    132
    rei3er, это все, конечно, интересно.. Но по-моему его такой вариант устроит. Да, pluton? :)
     
  13. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    ради бога
    тут просто точность важна ;)
     
  14. pluton

    pluton New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2007
    Сообщения:
    66
    Адрес:
    Odessa
    Код (Text):
    1. .equ O_RDONLY, 0
    вот это сработало, но включение в код увеличило размер исполняемого файла :dntknw:
    можно както объявить символ локальным или как юзать #define? всё, что с решётки - это коммент

    насчёт неинициализированной переменной. нужно было объявить fd: .long ?
    я выкрутился так: .lcomm fd, 4
    вариант .skip 4 // <- опять без метки

    зы. если что, извините, что я всё у вас спрашиваю. пока нет времени разбираться с манами
     
  15. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    я про это и говорил
    кто мешает добавить?
    Код (Text):
    1. fd: .skip 4
     
  16. pluton

    pluton New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2007
    Сообщения:
    66
    Адрес:
    Odessa
    значит, по-другому никак?
     
  17. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    читай посты
    я ведь писал
    Код (Text):
    1. #define PAGE_SIZE 0x1000
    2.  
    3. ...
    4.     movl    $PAGE_SIZE, %eax
    5. ...
    компилировать так
    <файл> должен иметь расширение .S
     
  18. pluton

    pluton New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2007
    Сообщения:
    66
    Адрес:
    Odessa
    всем большое спасибо. пока нужно юзать as, поэтому ограничюсь .equ
     
  19. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    pluton
    Константы в GAS обьявляются проще простого:

    myconstant = value

    Потом к имени константы нужно не забывать добавлять суффикс ($ для integer).

    Пример:

    myconst = 1
    pushl $myconst
     
  20. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    это не константы, а символы
    для каждого из них создается элемент таблицы символов с индексом секции SHN_ABS