美文网首页
手撕编译原理:汇编语言不会编

手撕编译原理:汇编语言不会编

作者: iOSDevLog | 来源:发表于2020-06-02 23:31 被阅读0次

NASM

Installation of NASM

wget -c http://www.nasm.us/pub/nasm/releasebuilds/2.14.02/nasm-2.14.02.tar.xz
tar -xf nasm-2.14.02.tar.xz
cd nasm-2.14.02
ls
./configure --prefix=/usr && make
sudo make install

version

$ nasm -v
NASM version 2.14.02 compiled on Jun  1 2020

demo

global main

main:
    mov eax, 5
    ret

Makefile

SRCS := first.asm
OBJS := $(SRCS:.asm=.o)
TARGET := $(OBJS:.o=)

all: $(TARGET)

$(TARGET): $(OBJS)
        gcc -m32 $< -o $@

%.o: %.asm
        nasm -f elf $< -o $@

.PHONY: all clean

clean:
        -rm -rf $(TARGET) $(OBJS)

make

$ make
gcc -m32 first.o -o first
/usr/bin/ld: cannot find crt1.o: No such file or directory
/usr/bin/ld: cannot find crti.o: No such file or directory
/usr/bin/ld: cannot find /lib/libgcc_s.so.1
collect2: error: ld returned 1 exit status
make: *** [Makefile:7: first] Error 1

glibc-devel

sudo yum install glibc-devel.i686 -y
sudo yum install libgcc.i686 -y

make

nasm -f elf first.asm -o first.o
gcc -m32 first.o -o first

查看返回值

# ./first ; echo $?
./first
echo $?

运算

add.asm

global main

main:
        mov eax, 15
        mov ebx, 19
        add eax, ebx
        ret

gdb

$ gdb add
(gdb) set disassembly-flavor intel
(gdb) disassemble main
Dump of assembler code for function main:
   0x08048480 <+0>:     mov    eax,0xf
   0x08048485 <+5>:     mov    ebx,0x13
   0x0804848a <+10>:    add    eax,ebx
   0x0804848c <+12>:    ret
   0x0804848d <+13>:    xchg   ax,ax
   0x0804848f <+15>:    nop
End of assembler dump.
(gdb) b *0x08048485# break *0x08048485
(gdb) r # run
(gdb) i r eax # info registers eax
eax            0xf                 15
(gdb) si # stepi Step one instruction exactly.
(gdb) info registers ebx
ebx            0x13                19
...
(gdb) i r # info registers
eax            0x22                34
ecx            0xbddbc2e           199081006
edx            0xffffd514          -10988
ebx            0x13                19
esp            0xffffd4ec          0xffffd4ec
ebp            0x0                 0x0
esi            0xf7fc0000          -134479872
edi            0x0                 0
eip            0x804848c           0x804848c <main+12>
eflags         0x216               [ PF AF IF ]
cs             0x23                35
ss             0x2b                43
ds             0x2b                43
es             0x2b                43
fs             0x0                 0
gs             0x63                99

...
(gdb) c # continue
Continuing.
[Inferior 1 (process 21718) exited with code 042]
(bdb) q

跳转

cmp & jmp

后缀 意义
a above
e equal
b below
n not
g greater
l lower
s signed
z zero

标志寄存器 eflags

eip : CPU 接下来要执行的代码

循环

for, while, do-while ==> goto + if

  • goto: jmp
  • if: cmp & jmp

函数

  • call + ret

  • 保存现场

  • 传递参数

  • 返回

x86 的环境下,栈是朝着低地址的方向伸长的。

  • 栈: call 指令保存 eip

  • esp(stack pointer): 寄存器

  • 汇编中发生函数调用相关的指令call和ret

  • call指令会产生跳转动作,与jmp不同的是,call之后可以通过ret指令跳回来
    call和ret的配合是依靠保存eip的值到栈里,返回时恢复eip实现的
    esp记录着当前栈顶所在的位置,每次call和ret执行都会伴随着入栈和出栈,也就是esp会发生变化

递归

  • push + pop

函数调用相关指令

  1. 通过寄存器传递参数和返回值
  2. 函数调用后的返回地址会保存到堆栈中
  3. 函数的局部状态也可以保存到堆栈中

明天手撕《汇编语言》第3版。

参考:

  1. https://www.nasm.us/
  2. http://www.linuxfromscratch.org/blfs/view/svn/general/nasm.html
  3. https://zhuanlan.zhihu.com/c_144694924

相关文章

  • 手撕编译原理:汇编语言不会编

    NASM Installation of NASM version demo Makefile make glib...

  • 【编程必备】本文集说明

    1.1 数据结构1.2 组成原理1.3 操作系统1.4 计算机网络1.5 汇编语言1.6 编译原理1.7 算法

  • 逆向 - 汇编 - 第一天

    reference 汇编语言与机器语言 高级语言 --(编译)-->汇编语言 --(编译)-->机器语言---->...

  • 创建私有CocoaPods仓库

    如何创建私有CocoaPods仓库 cocoapods的原理 Pods 项目最终会编译成一个名为 libPods....

  • 计算机技术

    科学路线 计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统...

  • 汇编语言

    基础知识: 汇编语言的主体是汇编指令,它决定了汇编语言特性 程序员用汇编语言写出源程序,再用汇编编译器将其编译成机...

  • ARM汇编

    汇编基本知识 高级语言可以通过编译得到汇编语言,汇编语言再编译成机器语言,机器语言也可以反汇编成汇编语言。每一条机...

  • 动态链接库和静态链接库

    C++静态库与动态库 预编译处理预编译命令2.编译将.c/.c++文件转化为汇编语言3.汇编将汇编语言转化为机器可...

  • 想吃面包别出去买了,手把手教你做手撕包,香甜软糯,奶香浓郁

    手撕已经成为了中的一种常态,很多的是食品都有手撕版本,例如手撕牛肉,手撕豆腐干,手撕鸭,手撕鸡,手撕面包当然也有的...

  • 手撕鸡

    手撕鸡、手撕面包、手撕包菜、手撕牛肉,各种手撕做法,听起来就很手工的感觉。我做的手撕鸡纯粹懒人所为。 具体做法如下...

网友评论

      本文标题:手撕编译原理:汇编语言不会编

      本文链接:https://www.haomeiwen.com/subject/huxuzhtx.html