LINUX.ORG.RU

gcc+asm

 , , ,


0

1

Всем привет! Такая проблема, не уверен, что это к вам, но вдруг. Если не сюда то посоветуйте на какой форум обратиться.

Суть:сижу под виндой, но мне надо средствами gcc написать на asm, MinGW. Скачал GNU Binutils,там есть as.exe и ld.exe. Все собирается. Код взял с хабра.

sqr.s

.section .data
msg:
.ascii "Hello, world!\n"
len = . - msg # символу len присваевается длина строки
.section .text
.global _start # точка входа в программу
_start:
movl $4, %eax # системный вызов № 4 — sys_write
movl $1, %ebx # поток № 1 — stdout
movl $msg, %ecx # указатель на выводимую строку
movl $len, %edx # длина строки
int $0x80 # вызов ядра
movl $1, %eax # системный вызов № 1 — sys_exit
xorl %ebx, %ebx # выход с кодом 0
int $0x80 # вызов ядра

Компилирую так

as sqr.s
ld a.out
a.exe

экзешник созадеться, но почему то при запуске выкидывает в дебагер MS.

Я вот не пойму это код не правильны или я не так компилирую.

Если это не по теме форума, то подскажите где могут посоветовать что делать.

Ты из-под винды дёргаешь линуксовое прерывание. Что называется, или крестик сними, или трусы надень.

mix_mix ★★★★★ ()

Суть:сижу под виндой

системный вызов № 4 — sys_write

вызов ядра

что делать

Сам-то как думаешь?

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

Я просто новичок в asm. Т.е. я не могу использую gcc под виндой собрать программу на asm?

я думал, что можно, про принципу qt один код на всех)

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

Ассемблер он на то и ассемблер.
Системные вызовы подергать точно не получиться, а вот с арифметикой все будет работать ок.

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

Ты путаешь «программу на языке ассемблера» и «программу, использующую интерфейсы ядра Linux». Язык — одно, а используемые библиотеки и интерфейсы — другое.

int $0x80 — это интерфейс системных вызовов ядра Linux. Подчёркиваю, ядра Linux. На винде такого нет. Там «разговаривать с операционной системой» нужно по-другому.

А язык тут ни при чём. Можно и из программы на Си дёргать системные вызовы линукса (и тогда заработает только под линуксом), а можно из ассемблера дёргать Qt (и тогда заработает на любом x86-совместимом процессоре на любой ОС, для которой есть Qt).

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

Я честно говоря не знаю впервые с таким сталкиваюсь, линуск+asm для меня новое.

Но вот когда я в коде пишу

mov $120,%ax
mov $10,%bx
add %bx,%ax

Он запускается, но ничего не происходит. Ну это я думаю из за того, что я ничего не вывожу. Информации очень мало, я так и не смог понять, как вывести на экран.

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

В чём задача-то? Написать программу на ассемблере под винду? Или написать программу на ассемблере под линукс и запустить её под виндой? Если первое, почему упор на gcc, а не более подходящие fasm или masm? Если второе, это в общем случае невозможно, если дёргать сисколы, а не линковаться с mscvrt.

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

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

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

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

понял. Спасибо. Я честно думал, что проблема в этом.

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

гораздо проще) надо сделать лабораторную работу, я привык на QT писать. А в конце у нас курсавик С++\asm. А qt на синтаксис intel ругается, вот я начал копать как запустить asm под QT. Там все просто если inline asm, а вот если через внешний модуль,то какие то проблемы... Вот я оказался здесь.

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

Нельзя «писать на Qt». Qt — это библиотека. Можно «писать на C++ с использованием Qt».

В твоём случае ты писал на C++ с использованием Qt, а в исходник на C++ вставлял куски на языке ассемблера.

А сейчас ты хочешь присоединить к своей программе на C++ целый модуль, написанный на языке ассемблера. Здесь тебе будет проще всего писать на ассемблере, используя функции из стандартной библиотеки Си (libc). Тогда твоя программа на языке ассемблера будет запускаться под любой ОС, для которой есть реализация libc.

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

да я уже понял.. быстрее было бы написать лабу на asm, а потом переписать под синтаксис at&t для курсача.

Я думал, так можно)

gccbug ()

и как такую лолку еще из уч. заведения ссаными тряпками не выгнали, тайна покрытая мраком

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

Тред не читай
@
скорее отвечай
?

я думал, что можно, про принципу qt один код на всех

trex6 ★★★★★ ()

Сабж

> int $0x80 # вызов ядра

Меня это порадовало. Хочу эмуляцию int 0x80 в винде!

luke ★★★★★ ()

Предлагаю тебе скачать старый turbo assembler под MS-DOS и найти какую-нибудь книжку типа «Ассемблер для ДОС», таких очень много и разных. Сначала будет даже под виндой работать.

luke ★★★★★ ()

Cygwin случайно не эмулирует обращения к ядру?

Странная затея, берёшь nasm, там хоть для доса бинарники собираешь с любым синтаксисом исходника. Или fasm, но про него я ничего не знаю и вроде бы не умеет в 8/16 бит.

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

Разного уровня, да. Но ТС вроде собрался использовать AT&T синтаксис и линуксовые прерывания под вендой, а cygwin как раз предоставляет совместимый слой абстракции.

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

Перехват прерываний в юзерспейсе? Месье знает толк в извращениях )
В asm под mingw можно дёргать только dll'ки и win32api

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