本篇介绍
本篇介绍下数据在计算机中的表示形式以及常用的寄存器, 最后再学一个稍微复杂点的代码。
内容介绍
补码
对于有符号整数类型,负数是以补码(complement)形式保存的,这样可以方便做运算,补码就是绝对数的各个bit位取反然后加1,举个例子如下:
代码语言:javascript复制有符号整数 17
二进制形式: 0000 0000 0001 0001
十六进制: 0x0011
有符号整数 -17
绝对值 17
二进制形式: 0000 0000 0001 0001
补码形式: 1111 1111 1110 1110
加1: 1111 1111 1110 1111
十六进制: 0xffef
再计算下 17 (-17)
二进制:
0000 0000 0001 0001
1111 1111 1110 1111
= 0000 0000 0000 0000
十六进制: 0x0000
这样就简单很多了,减法也可以使用加法的规则
寄存器
通用寄存器如下:
image.png
指令寄存器(rip) 用来存放即将执行的下一条指令地址。 标记寄存器(rlags),个别字段介绍如下:
image.png
打印字符串
在编辑器中写入如下的代码:
代码语言:javascript复制 ; hello.asm
section .data
msg1 db "hello, world",10, 0
msg1Len equ $-msg1-1 ; $ 表示取当前地址
msg2 db "Alive and Kicking!", 10,0
msg2Len equ $-msg2-1
radius dq 357
pi dq 3.14
section .bss
section .text
global main
main:
push rbp ; prologue
mov rbp, rsp
mov rax,1
mov rdi,1
mov rsi, msg1
mov rdx,msg1Len
syscall
mov rax, 1
mov rdi,1
mov rsi, msg2
mov rdx, msg2Len
syscall
mov rsp, rbp ; epilogue
pop rbp
mov rax,60
mov rdi,0
syscall
编译后用gdb 加载并执行disassemble main
,这时候会发现汇编是att格式的,如下:
image.png
而我们写的汇编是intel风格的,这时候可以设置下flavor,set disassembly-flavor intel
, 再反汇编看下,就会看到格式变成intel了:
image.png
这时候再简单提下prologue和epilogue对于gdb的作用,如果没有他们,那么gdb就不能单步调试了。