终于体验到在Linux下使用Asm 和 C的混合编写生成-elf文件。
在程序中的函数相互调用显然使用的是堆栈进行。
而中断 int 0x80 却没搞清楚。可以明确的是这是个BIOS中断可以实现多种功能,使用eax选择功能,当eax=4时是屏幕输出,ebx为输出个数,ecx是字符长度,edx则为字符内容。
参数的传递遵循后边的参数先入栈
foo.asm
extern choose
[section .data]
num1 dd 3
num2 dd 4
[section .text]
global _start
global myprint
_start:
push dword [num1]
push dword [num2]
call choose
add esp , 8
mov ebx , 0
mov eax , 1
int 0x80
myprint:
mov edx , [esp+8]
mov ecx , [esp+4]
mov ebx , 1
mov eax , 4
int 0x80
ret
~
使用 nasm -f elf -o foo.o foo.asm 编译 ,生成elf格式的.o文件
bar.c
void myprint(char* msg , int len);
int choose(int a,int b)
{
if ( a>=b )
myprint("the 1st one\n",13);
else
myprint("the 2st one\n",13);
return 0;
}
~
使用gcc -c -o bar.o bar.c编译
用ld -o f foo.o bar.o 链接
================================================================================
在Linux 的Vim中 可以打开多个程序使用Alt + 1/2/3 切换,而Shift + Ctrl + T则可打开终端,还挺方便
自己的评论:
1:对于vim的切换,那样感觉行不通,但是也可能因为是虚拟机下面的ubuntu的问题。。。。以后去双系统的ubuntu试试效果。。。。不过shift+ctrl+t打开中断的方式还是挺不错的,现在也意识到快捷键等的方式对于使用的影响了,感觉很棒啊。。。很舒适
2:本文生成ELF,运行的时候是:~# ./f 的执行方式