c语言栈指针移动原理,C指针原理(4)-ATamp;T汇编
首先我們先用匯編編寫一個helloworld,注意我們直接在匯編代碼中調用C語言的printf函數將"hello,world\n" 輸出在屏幕上。
.section .data
output:
.asciz "hello,world\n"
.section .text
.global ?main
main:
push $output
call printf
addl $4,%esp
push $0
call exit
上述代碼中,
push $output將參數入棧,以便printf調用,
然后調用printf,printf會在棧中取出它需要的參數
2)我們直接使用GCC編譯后運行
deepfuture@ubu-s:~$ gcc -o ?test test.s
deepfuture@ubu-s:~$ ./test
hello,world
3)那么調用C庫函數所需要的參數入棧的順序是什么?
再看一個例子
.section .data
myvalue:
.byte 67,68,69,70,0
mygs:
.asciz "%s\n"
.section .text
.globl main
main:
movl $myvalue,%ecx
push %ecx
push $mygs
call printf
push $0
call exit
67,68,69,70是C、D、E、F的ASCII碼,0是字符串終結符
這段代碼的功能是輸出“CEDF”,相當于下面的C代碼
#include
int main( void )
{
char myvalue[]={67,68,69,70,0};
printf( "%s\n" ,myvalue);
return 0;
}
其中,后面的0表示字符串的終結符。
第一個參數最后一個入棧,按調用的相反順序入棧
?著作權歸作者所有:來自51CTO博客作者myhaspl的原創作品,如需轉載,請注明出處,否則將追究法律責任
總結
以上是生活随笔為你收集整理的c语言栈指针移动原理,C指针原理(4)-ATamp;T汇编的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java并发编程以及并发须知的几个概念:
- 下一篇: 求二叉树中以x为根的子树的深度_还在玩耍