Linux操作系统, 构建自己的内核——4. C语言结合汇编开发系统内核

课程链接:
https://blog.csdn.net/tyler_download/article/details/52468520

课程主要讲解的是如何把c跟汇编结合起来进行开发。
从理论上来说,这不难,因为C要变成最终执行的二进制,中间就有编译成汇编这一个步骤。把C编译出的汇编与写的汇编结合起来不就OK了?
但是实际操作起来却有各种各样的问题,归根结底还是对汇编了解太少了,出了错完全不知所措。我只做到了编译成功,执行结果却不太对,简单记录一下自己遇到的问题。

1. objconv无法编译成功
用的虚拟机是debian 9。编译作者提供的objconv报错:
src/coff.cpp:142:1: error: narrowing conversion of ‘2147483648u’ from ‘unsigned int’ to ‘int’ inside { } [-Wnarrowing]
在这里插入图片描述

在网上找了一个可用的:
https://stackoverflow.com/questions/17676026/converting-c-to-nasm-assembly

2.error: invalid operand type
在foo.asm中引入bar.asm,报以上错误:
在这里插入图片描述
没理解这个错误的意思,找到了一个链接:
https://stackoverflow.com/questions/14785964/invalid-operand-type-error

按这个方法解决:
marker: add eax, _GLOBAL_OFFSET_TABLE_-(marker-main)

之后可以正常编译出foo.o。但是最后得到的foo却无法正常打印文字。
在这里插入图片描述

先不管了,继续往后学习吧。

20190908补充:
出现这个错误是因为在32位虚拟机上编译代码所致。
在64位虚拟上编译就OK了。

附一下修改完成之后的foo.asm(把bar.asm放到一起了)

extern _GLOBAL_OFFSET_TABLE_                            ; byte


[section .data]
arg1  dd 5
arg2  dd 4

[section .text]
main:
mov   eax, dword[arg1]
push  eax
mov   eax, dword [arg2]
push  eax
call  bar_func
add   esp, 8
mov   ebx,0
mov   eax, 1
int   0x80


foo_print:
mov   edx, [esp + 8]
mov   ecx, [esp + 4]
mov   ebx, 1
mov   eax, 4
int   0x80
ret

bar_func:; Function begin
        push    ebp                                     ; 0000 _ 55
        mov     ebp, esp                                ; 0001 _ 89. E5
        push    ebx                                     ; 0003 _ 53
        sub     esp, 4                                  ; 0004 _ 83. EC, 04
        call    __x86.get_pc_thunk.ax                   ; 0007 _ E8, FFFFFFFC(rel)
marker: add     eax, _GLOBAL_OFFSET_TABLE_-(marker-main)            ; 000C _ 05, 00000001(GOT r)
        mov     edx, dword [ebp+8H]                     ; 0011 _ 8B. 55, 08
        cmp     edx, dword [ebp+0CH]                    ; 0014 _ 3B. 55, 0C
        jle     ?_001                                   ; 0017 _ 7E, 18
        sub     esp, 8                                  ; 0019 _ 83. EC, 08
        push    13                                      ; 001C _ 6A, 0D
        lea     edx, [?_003+eax]                        ; 001E _ 8D. 90, 00000000(GOT)
        push    edx                                     ; 0024 _ 52
        mov     ebx, eax                                ; 0025 _ 89. C3
        call    foo_print                               ; 0027 _ E8, FFFFFFFC(PLT r)
        add     esp, 16                                 ; 002C _ 83. C4, 10
        jmp     ?_002                                   ; 002F _ EB, 16

?_001:  sub     esp, 8                                  ; 0031 _ 83. EC, 08
        push    13                                      ; 0034 _ 6A, 0D
        lea     edx, [?_004+eax]                        ; 0036 _ 8D. 90, 0000000D(GOT)
        push    edx                                     ; 003C _ 52
        mov     ebx, eax                                ; 003D _ 89. C3
        call    foo_print                               ; 003F _ E8, FFFFFFFC(PLT r)
        add     esp, 16                                 ; 0044 _ 83. C4, 10
?_002:  mov     eax, 0                                  ; 0047 _ B8, 00000000
        mov     ebx, dword [ebp-4H]                     ; 004C _ 8B. 5D, FC
        leave                                           ; 004F _ C9
        ret                                             ; 0050 _ C3
; bar_func End of function



?_003:                                                  ; byte
        db 74H, 68H, 65H, 20H, 31H, 73H, 74H, 20H       ; 0000 _ the 1st
        db 6FH, 6EH, 65H, 0AH, 00H                      ; 0008 _ one..

?_004:                                                  ; byte
        db 74H, 68H, 65H, 20H, 32H, 6EH, 64H, 20H       ; 000D _ the 2nd
        db 6FH, 6EH, 65H, 0AH, 00H                      ; 0015 _ one..



__x86.get_pc_thunk.ax:; Function begin
        mov     eax, dword [esp]                        ; 0000 _ 8B. 04 24
        ret                                             ; 0003 _ C3
; __x86.get_pc_thunk.ax End of function

参考:
Linux下C程序的反汇编

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值