Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将参数从C传递到汇编函数?_C_Assembly_X86_Calling Convention - Fatal编程技术网

如何将参数从C传递到汇编函数?

如何将参数从C传递到汇编函数?,c,assembly,x86,calling-convention,C,Assembly,X86,Calling Convention,我试图在ubuntu 32位机器上编写一些汇编代码,使用write syscall打印字符串。 到目前为止,我的工作是: main.c文件: extern int my_write(); int main(){ my_write(); return 0; } my_write.s文件: .globl my_write .type my_write, @function .section .data str: .ascii "this is my str

我试图在ubuntu 32位机器上编写一些汇编代码,使用write syscall打印字符串。 到目前为止,我的工作是:

main.c文件:

extern int my_write();


int main(){
    my_write();
    return 0;
}
my_write.s文件:

.globl my_write
.type my_write, @function


.section .data
    str: .ascii "this is my string\n"
    len: .quad . - str

.section .text
my_write:

    mov $0x4, %eax # use the write syscall
    mov $0x1, %ebx # write to standard output
    mov $str, %ecx
    mov $len, %edx
    int $0x80      #trap

    mov $0x1, %eax #exit syscall
    mov $0x0, %ebx #exit status of 0
    int $0x80 #trap
我使用以下命令编译了这些文件:
gcc-Wall main.c my_write.s-o main

它可以工作并打印“这是我的字符串”

但是字符串是在汇编中硬编码的。 我的问题是-如何从C文件传递我自己的字符串? 比如:

extern int my_write(char *str, int len);


int main(){
    char str[] = "this is my string\n";
    my_write(str, 18);
    return 0;
}

,查找“用户界面:函数调用”。在32位代码中,参数被推到堆栈上返回地址之前,从右到左,因此您可以执行
mov4(%esp),%ecx;mov 8(%esp),%edx
。请记住,您正在编写32位asm,因此您必须使用
-m32
编译您的C代码以匹配它,除非您使用的是较旧的32位系统,这是默认设置。谢谢!