Linux Asm + C (int 0x80)

本文介绍如何在Linux环境下使用C与汇编(Asm)混合编程生成ELF文件,具体包括如何通过汇编代码调用C语言编写的函数,并详细展示了参数传递过程及使用int 0x80实现屏幕输出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转自的博客地址: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  的执行方式

[ 37.930000] BUG: scheduling while atomic: swapper/0/0x40000102 [ 37.930000] Modules linked in: [ 37.940000] CPU: 0 PID: 0 Comm: swapper Not tainted 3.10.108+ #40 [ 37.940000] Backtrace: [ 37.940000] [<c0011f44>] (dump_backtrace+0x0/0x10c) from [<c0012158>] (show_stack+0x18/0x1c) [ 37.950000] r6:c0492018 r5:c04a21b8 r4:00000000 r3:00000000 [ 37.960000] [<c0012140>] (show_stack+0x0/0x1c) from [<c036ce84>] (dump_stack+0x20/0x28) [ 37.970000] [<c036ce64>] (dump_stack+0x0/0x28) from [<c036a41c>] (__schedule_bug+0x4c/0x64) [ 37.980000] [<c036a3d0>] (__schedule_bug+0x0/0x64) from [<c036f784>] (__schedule+0x408/0x480) [ 37.980000] r4:c049c678 r3:00000000 [ 37.990000] [<c036f37c>] (__schedule+0x0/0x480) from [<c0046bb4>] (__cond_resched+0x28/0x38) [ 38.000000] [<c0046b8c>] (__cond_resched+0x0/0x38) from [<c036feb0>] (_cond_resched+0x40/0x48) [ 38.000000] r4:c39b8c4c r3:00000101 [ 38.010000] [<c036fe70>] (_cond_resched+0x0/0x48) from [<c0272c74>] (nuc970_poll+0x238/0x308) [ 38.020000] [<c0272a3c>] (nuc970_poll+0x0/0x308) from [<c02b09dc>] (net_rx_action+0xbc/0x1e8) [ 38.030000] [<c02b0920>] (net_rx_action+0x0/0x1e8) from [<c0024dec>] (__do_softirq+0xdc/0x1d8) [ 38.030000] [<c0024d10>] (__do_softirq+0x0/0x1d8) from [<c0024fd0>] (do_softirq+0x54/0x60) [ 38.040000] [<c0024f7c>] (do_softirq+0x0/0x60) from [<c0025240>] (irq_exit+0x5c/0x9c) [ 38.050000] r4:c04bb908 r3:00000008 [ 38.050000] [<c00251e4>] (irq_exit+0x0/0x9c) from [<c000fb64>] (handle_IRQ+0x3c/0x8c) [ 38.060000] r4:c04bb908 r3:00000000 [ 38.060000] [<c000fb28>] (handle_IRQ+0x0/0x8c) from [<c0008410>] (asm_do_IRQ+0x10/0x14) [ 38.070000] r6:f0000000 r5:60000013 r4:c000fd20 r3:c000fd28 [ 38.080000] [<c0008400>] (asm_do_IRQ+0x0/0x14) from [<c000e870>] (__irq_svc+0x30/0x74) [ 38.090000] Exception stack(0xc0493f30 to 0xc0493f78) [ 38.090000] 3f20: 00000000 0005317f 0005217f 60000013 [ 38.100000] 3f40: c0492000 c0492000 c049a074 c0492000 c04cb6ee c04cb6ee 00465d64 c0493f84 [ 38.110000] 3f60: 600000d3 c0493f78 c000fd28 c000fd20 60000013 ffffffff [ 38.110000] [<c000fcf4>] (arch_cpu_idle+0x0/0x3c) from [<c004e0ec>] (cpu_startup_entry+0xbc/0x108) [ 38.120000] [<c004e030>] (cpu_startup_entry+0x0/0x108) from [<c0369728>] (rest_init+0x78/0x90) [ 38.130000] r7:c049a000 r3:c0372dcc [ 38.140000] [<c03696b0>] (rest_init+0x0/0x90) from [<c044ba20>] (start_kernel+0x27c/0x2c8) [ 38.140000] r4:c049a0e0 r3:00000000 [ 38.150000] [<c044b7a4>] (start_kernel+0x0/0x2c8) from [<00008040>] (0x8040) 分析一下
最新发布
07-19
Exception Class: Kernel (KE) PC is at [<ffffffead9233bec>] path_openat+0x924/0xc60 LR is at [<ffffffead9233b08>] path_openat+0x840/0xc60 Current Executing Process: cpu:4 [Thread-16, 17227][main, 868] Backtrace: [<ffffffead8f61408>] notify_die+0x4c/0x8c [<ffffffead8ea40d4>] die+0x90/0x308 [<ffffffead8ebaa74>] __do_kernel_fault+0x250/0x280 [<ffffffead8eba6e4>] do_bad_area+0x2c/0xdc [<ffffffead9ea2454>] do_translation_fault+0x3c/0x54 [<ffffffead8eba0b4>] do_mem_abort+0x54/0x118 [<ffffffead9e8dc18>] el1_abort+0x38/0x5c [<ffffffead9e8dba0>] el1h_64_sync_handler+0x50/0x90 [<ffffffead8e91294>] el1h_64_sync+0x64/0x6c [<ffffffead9233bec>] path_openat+0x924/0xc60 [<ffffffead9233218>] do_filp_open+0xb4/0x164 [<ffffffead921edf0>] do_sys_openat2+0x80/0xf0 [<ffffffead921ef64>] __arm64_sys_openat+0x6c/0x9c [<ffffffead8ead8fc>] invoke_syscall+0x54/0x114 [<ffffffead8ead81c>] el0_svc_common+0x7c/0xe0 [<ffffffead8ead790>] do_el0_svc+0x18/0x28 [<ffffffead9e8e0d8>] el0_svc+0x34/0x68 [<ffffffead9e8e04c>] el0t_64_sync_handler+0x64/0xbc [<ffffffead8e91584>] el0t_64_sync+0x1a4/0x1ac $** *** *** *** *** *** *** *** Fatal *** *** *** *** *** *** *** **$ ===============__exp_main.txt_begin================= $** *** *** *** *** *** *** *** Fatal *** *** *** *** *** *** *** **$ Build Info: 'alps-vf-mp-v0.mp1.tc16sp-pr2unknown:alps-vf-mp-v0.mp1.tc16sp-pr2unknownRMX3910export_11_15.0.0.800(EX01)_2025042423420000.RMX3910export_11_15.0.0.800(EX01)_2025042423420000:mt6768:S01,realme/RMX3910INT/RE5C42:15/AP3A.240617.008/U.R4T2.1d8d5af-75f9:user/release-keys' MSSI Info: 'oplus/ossi/ossi:15/AP3A.240617.008/1745501558782:user/release-keys' MGVI Info: '' MGK Info: '' VF System Info: 'unknown:RMX3910export_11_15.0.0.800(EX01)_2025042423420000' Exception Log Time:[Sat Jun 7 18:22:12 WIB 2025] [17.931865] Exception Class: Kernel (KE) PC is at [<ffffffead9233bec>] path_openat+0x924/0xc60 LR is at [<ffffffead9233b08>] path_openat+0x840/0xc60 Current Executing Process: cpu:4 [Thread-16, 17227][main, 868] 分析这一段报错
06-13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值