Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm для Linux/Unix > Работа с системными вызовами


Автор: rigan 16.11.2010, 20:40
Добрый вечер!
Решил поизучать ассемблер в целях саморазвития. Появились вопросы по работе с системными вызовами и структурами.
Например есть код на Си :
Код

int main(int argc, char *argv[])
{
struct stat status;
stat(argv[1], &status);
printf("%d\n", status.st_size);
return 0;
}

Подскажите как его можно реализовать с помощью системных вызовов? То есть, не через call stat, а именно  через int $0x80.


Автор: airyashov 17.11.2010, 14:05
у gss есть ключ которым можно посмотреть asm листинг

Автор: rigan 17.11.2010, 16:48
В этом листинге,  через сall вызываются обвертки, а параметры передаются через стек. С этим я уже разобрался...
Мне хочется разобраться, как это работает через прерывание $int $0x80. Я не понимаю где и как распологать структуры...
Как вообще работать со структурами из  системных заголовочных файлов? Может мне кто-нибудь объяснить?

Автор: 500mhz 18.11.2010, 13:27

mov     edx,lun     ;3 параметр, длинна сообщения которое выводим
mov     ecx,hw      ;2 параметр, собственно адрес в памяти где лежит сообшение
mov     ebx,1       ;1 параметр, дескриптор куда пишем (в нашем случае stdout)
mov     eax,4       ;номер функции syscall write
int     0x80        ;дергаем прерывание

Автор: rigan 18.11.2010, 19:04
500mhz, спасибо. С этим  Разобрался.
А как быть со структурами? Например структура utmp. Как c ней работать? Может инклюдить заголовочные файлы надо?

Автор: 500mhz 18.11.2010, 21:10
rigan
инклуды от С/С++ не помогут ) если только как образец. Придется тебе ее переписать с учетом синтаксиса асма который используеш.
И потом обычно при работе с структурами в одной из регистровых пар передаеться ее адрес.

Автор: ВладимирИванович 27.3.2017, 07:51
Здравствуйте. Так как моя проблема соответствует теме и чтобы не плодить однотипных тем, решил написать в этой теме.
Есть файл, содержащий текст. Большой файл, под гигабайт.
В этом файле строки разной длины, а обработать надо строку полностью - поэтому я на fasm-е под win написал утилитку по такому (упрощённому) алгоритму:

1. открыть файл
2. запрос памяти        ;    CreateFileMapping
3. чтение файла в память    ;    MapViewOfFile
4. запрос памяти        ;    GetProcessHeap
;  в памяти существующий файл и "плацдарм" для нового файла
5. перенос необходимого с существующего файла в "плацдарм"
6. создать новый файл
7. сохранить "плацдарм" в созданный файл

Под wine отрабатывает так, как мне нужно. Но я пользуюсь линуксом и хочется переписать под линукс. И заморока тут на четвёртом пункте. Как бы это реализовать?

Автор: ВладимирИванович 1.4.2017, 08:28
Здравствуйте. Немного продвинулся. Теперь у меня ступор на таком куске кода:
Код

; создание и открытие файла
    mov    eax,SYS_open
    mov    ebx,nam_file
    mov    ecx,O_CREAT+O_TRUNC+O_RDWR
    mov    edx,S_IRUSR+S_IWUSR+S_IRGRP+S_IROTH
    int    80h
; запрос памяти
    xchg    edi,eax        ; EDI хендл файла
    mov    eax,192        ; вызов MMAP
    xor    ebx,ebx        ; начальный адрес
    mov    ecx,[size_file]    ; требуемый размер
    mov    edx,PROT_READ+PROT_WRITE    ; флаги
    mov    esi,MAP_SHARED    ; флаги
    mov    ebp,0        ; смещение
    int    80h
; копирование старого файла в новый
    mov    esi,[map_file] ; адрес с содержимым 1
    mov    edi,eax        ; адрес в выделенной памяти
    mov    ecx,[size_file] ; размер
    repnz    movsb        ; перенос



Последняя команда прерывает работу, не позволяя записывать в память, хотя флаги разрешают, почему так?

Автор: Seenkao 5.9.2022, 07:59
Если у кого возникнут вопросы подобного рода.

https://www.youtube.com/watch?v=Wk4o7OjXmEw&list=PLKRkz7NEae7EF5wybV2NlNvJ-IcL9lzef - под видео так же выложены разные ссылки.
https://disk.yandex.ru/d/oBK-BHew7hKFkQ - позже выложу на гитхаб.
https://chromium.googlesource.com/chromiumos/docs/+/master/constants/syscalls.md

 smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)