Создание каталога на ассемблере Linux - PullRequest
1 голос
/ 19 марта 2012

Я пытаюсь создать небольшую программу сборки для создания папки. Я посмотрел системный вызов для создания каталога на этой странице . Это говорит, что это идентифицировано 27h. Как бы я пошел о реализации mkdir somename в сборке?

Я знаю, что программа должна перейти на eax, но я не уверен, куда идти дальше. Я немного погуглил, и, похоже, никто не опубликовал в интернете об этом.

Это мой текущий код (я не знаю, в какой регистр поместить имя файла и т. Д.):

section .data

section .text
global _start

mov eax, 27
mov ????????
....
int 80h

Спасибо

Ответы [ 2 ]

5 голосов
/ 19 марта 2012

Один из способов выяснить, использует GCC для перевода следующего кода C:

#include <stdio.h>
#include <sys/stat.h>

int main()
{
    if (mkdir("testdir", 0777) != 0)
    {
        return -1;
    }

    return 0;
}

в сборку, с: gcc mkdir.c -S

    .file   "mkdir.c"
    .section    .rodata
.LC0:
    .string "testdir"
    .text
.globl main
    .type   main, @function
main:
.LFB0:
    .cfi_startproc
    pushl   %ebp
    .cfi_def_cfa_offset 8
    .cfi_offset 5, -8
    movl    %esp, %ebp
    .cfi_def_cfa_register 5
    andl    $-16, %esp
    subl    $16, %esp
    movl    $511, 4(%esp)
    movl    $.LC0, (%esp)
    call    mkdir           ; interesting call
    testl   %eax, %eax
    setne   %al
    testb   %al, %al
    je  .L2
    movl    $-1, %eax
    jmp .L3
.L2:
    movl    $0, %eax
.L3:
    leave
    .cfi_restore 5
    .cfi_def_cfa 4, 4
    ret
    .cfi_endproc
.LFE0:
    .size   main, .-main
    .ident  "GCC: (GNU) 4.5.1 20100924 (Red Hat 4.5.1-4)"
    .section    .note.GNU-stack,"",@progbits

В любом случае, ProgrammingGroundUp на странице 272 перечислены важные системные вызовы, включая mkdir:

%eax   Name    %ebx                 %ecx       %edx    Notes
------------------------------------------------------------------
39     mkdir   NULL terminated    Permission           Creates the given
               directory name                          directory. Assumes all 
                                                       directories leading up 
                                                       to it already exist.
0 голосов
/ 19 марта 2012

Вы также можете сделать так, как предлагает Assembly Howto .Но действительно, вызов mkdir из Libc более переносим.Вам нужно заглянуть в asm/unistd.h, чтобы получить номер системного вызова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...