课程链接:
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程序的反汇编