2012-03-19 28 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以获取系统调用号码。