Linux Asm + C (int 0x80)

来源:互联网 发布:做mmd的软件 编辑:程序博客网 时间:2024/04/27 15:09
 

转自的博客地址:http://blog.sina.com.cn/s/blog_79b802790100q8tt.html



 终于体验到在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 foo.o bar.o 链接



================================================================================
在Linux 的Vim中 可以打开多个程序使用Alt 1/2/3 切换,而Shift Ctrl T则可打开终端,还挺方便





自己的评论:

       1:对于vim的切换,那样感觉行不通,但是也可能因为是虚拟机下面的ubuntu的问题。。。。以后去双系统的ubuntu试试效果。。。。不过shift+ctrl+t打开中断的方式还是挺不错的,现在也意识到快捷键等的方式对于使用的影响了,感觉很棒啊。。。很舒适

      2:本文生成ELF,运行的时候是:~#  ./f  的执行方式