环境搭建
安装GCC和NASM
## 安装64位GCC
yum install gcc
## 安装32位GCC库
yum install glibc-devel.i686
yum install ibstdc++.i686
## 安装nasm
yum install nasm
测试
1、示例程序
section .text
global main
main:
mov ebx,10
mov eax,20
add eax,ebx
ret
2、编译链接
## -g -F stabs用于生成debug
## 64bit程序使用elf64和m64
nasm -f elf32 test.asm -g -F stabs -o test.o
gcc -m32 test.o -o test
3、执行
./test; echo $?
30
4、生成与GCC无关的汇编
section .text
global _start
_start:
mov ebx,10
mov eax,20
add ebx,eax ; 系统调用的参数
mov eax,1 ; 系统调用功能号
int 0x80 ; linux系统调用
## -g -F stabs用于生成debug
## 64bit程序使用elf64和elf_x86_64
asm -f elf test.os.asm -g -F stabs -o test.o
ld -m elf_i386 test.o -o test
linux平台的系统调用是通过int 0x80来实现的,eax寄存器中为调用的功能号,ebx、ecx、edx、esi等等寄存器则依次为参数。
/usr/include/asm/unistd.h
GDB调试
- 简单示例
gdb -tui ./test ##进入调试
b _start ##设置断点break
r ##执行run
si ##汇编级别单步执行stepi,函数进入
ni ##汇编级别单步执行nexti,函数不进入
c ##继续continue
- layout 命令
作用:用于分割窗口,可以一边查看代码,一边测试。主要有以下几种用法:
layout src(显示源代码窗口)
layout asm(显示汇编窗口)
layout regs(显示源代码/汇编和寄存器窗口)
layout split(显示源代码和汇编窗口)
layout next(显示下一个layout)
layout prev(显示上一个layout)
Ctrl + L(刷新窗口)
Ctrl + x,1(单窗口模式,显示一个窗口)
Ctrl + x,2(双窗口模式,显示两个窗口)
Ctrl + x,a(退出layout)
-
disassemble命令
输出反编译的汇编代码 -
set disassemble-next-line on
调试时输出汇编代码