2012-03-19 68 views
1

我想創建一個小的彙編程序來創建一個文件夾。我查找了在this page上創建目錄的系統調用。它說它是由27h確定的。我將如何去執行裝配中的mkdir somename在linux彙編語言中創建一個目錄

我知道程序應該將27移入eax,但我不確定接下來要去哪裏。我搜索了很多,似乎沒有人在網上發佈關於這方面的東西。

這是我當前的代碼(我不知道在哪一個寄存器把文件名等):

section .data 

section .text 
global _start 

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

由於查不到

+6

先在C中編寫一個簡單的mkdir示例,然後對其進行測試,然後反彙編(gcc -S)。這種技術適用於許多關於彙編編程的「如何」問題。 – 2012-03-19 17:47:13

+0

我使用NASM的方式。 我嘗試過,但是當我拆解它時,並不會爲示例調用中斷。 – 2012-03-19 17:49:39

+1

這可能是真的,但是你有沒有直接使用系統調用中斷的原因,而不是僅僅調用'mkdir'? – 2012-03-19 17:51:11

回答

5

的一種方法,是使用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

@Jayson更新回答問題。 – karlphillip 2012-03-19 18:01:55

+1

調用mkdir(進入libc)更便於使用(就像人們可以首先調用匯編程序一樣...),而不是用現代硬件實際上已經過時的int 80揮霍。 – 2012-03-19 18:02:29

+0

感謝大家的回答。我將使用調用mkdir來實現它。 – 2012-03-19 18:05:49

0

你也可以做類似的Assembly Howto是在暗示。但確實,從Libc調用mkdir更便攜。您需要查看asm/unistd.h以獲取系統調用號碼。