姬長信(Redy)

在GNU C内联汇编中编写Linux int 80h系统调用包…


参见英文答案 > How to invoke a system call via sysenter in inline assembly?????????????????????????????????????2个
我正在尝试使用内联汇编…
我读了这页http://www.codeproject.com/KB/cpp/edujini_inline_asm.aspx,但我无法理解传递给我的函数的参数.

我正在写一个C写的例子..这是我的函数头:

write2(char *str, int len){
}

这是我的汇编代码:

global write2
write2:
    push ebp
    mov ebp, esp
    mov eax, 4      ;sys_write
    mov ebx, 1      ;stdout
    mov ecx, [ebp+8]    ;string pointer
    mov edx, [ebp+12]   ;string size
    int 0x80        ;syscall
    leave
    ret

我该怎么做才能将代码传递给C函数…我正在做这样的事情:

write2(char *str, int len){
    asm ( "movl 4, %%eax;"
          "movl 1, %%ebx;"
          "mov %1, %%ecx;"
          //"mov %2, %%edx;"
          "int 0x80;"
           :
           : "a" (str), "b" (len)
    );
}

那是因为我没有输出变量,所以我该如何处理呢?
此外,使用此代码:

global main
main:
    mov ebx, 5866       ;PID
    mov ecx, 9      ;SIGKILL
    mov eax, 37     ;sys_kill
    int 0x80        ;interruption
    ret 

如何将代码内联到我的代码中……所以我可以向用户请求pid ..就像这样..
这是我的预制

void killp(int pid){
    asm ( "mov %1, %%ebx;"
          "mov 9, %%ecx;"
          "mov 37, %%eax;"
           :
           : "a" (pid)         /* optional */
    );
}