Ubuntu x86-64汇编(1)

时间:2023-01-30 15:12:41

x86-64 Assembly Language Programming with Ubuntu 的读书记录

x86计算机体系架构

架构总览

CPU, RAM, 存储, 输入输出设备等, 数据的尺寸(byte 8bit, word 16bit, double-word 32bit, quadword 64bit, double-quadword 128bit)

CPU寄存器

64bit寄存器: rax, rbx, rcx, rdx;  rsi, rdi, rbp, rsp;   r8, r9, r10, r11, r12, r13, r14, r15;

RSP: stack pointer register, 指向当前栈顶地址
RBP: base pointer register, 当调用函数时指向基础地址
RIP: instruction pointer register, 指向下一个要执行的指令的地址
rFlags
  CF, carry, 前一个操作结果是否带进位
  PF, parity, 最后一个字节是否带有偶数个1
  AF, adjust, 用于二进制编码的十进制运算
  ZF, zero, 前一个操作结果是否为0
  SF, sign, 前一个操作在msb(most significant bit)位是否为1, 及符号位是否为1
  DF, direction, 在某些字符串操作时指定方向
  OF, overflow, 前一个操作结果是否溢出
XMMs: 用于支持浮点运算和SIMD(single instruction multiple data)指令, 以及SSE(Streaming SIMD Extension), SIMD指令允许同时对多条数据执行同一个指令, 在某些场景可以有效提升性能.

Cache 缓存和内存

CPU片内缓存分一级和二级(新出的CPU还有三级缓存), 一级缓存与每个内核绑定, 二级缓存是多核共用.

内存使用小端格式(Little-endian), 即LSB(Least Significant Byte)存储在低地址, 而MSB(Most Significant Byte)存储在高地址位.

内存布局: 堆(heap)从低地址往高地址增长, 栈(stack)从高地址往低地址增长

各级存储的访问速度

寄存器    1ns级别, 和CPU同步
片内缓存 10ns级别
内存        100ns级别
SSD硬盘   0.05ms级别, 比内存的访问时间大500倍
HDD硬盘  5ms级别, 比内存的访问时间大5w倍, 比SSD的大100倍

 

数据类型的展示

整数

byte, word, double-word, quadword, double-quadword,
unsigned, signed

带符号数的负数的计算: 先算出其正数的二进制数, 然后对各位取反, 然后加1
例如计算-9的二进制数, 先得到9的二进制数0000 1001 取反得到 1111 0110, 加1得到最终结果 1111 0111, 对应的hex值为 F7

带符号和不带符号数的加减: 计算方式完全相同, 结果自动适应带符号或不带符号

浮点数

参考另一篇文章

字符

American Standard Code for InformationInterchange (ASCII), Unicode
字符串的表示, 最后一个字符使用NULL

 

汇编程序格式

一般包含三部分: Data 用于声明和变量赋值, BSS用于声明变量但是不赋值, 以及代码部分

注释, 使用分号";"

数字值: 可以使用十进制, 十六进制或八进制赋值, 默认为十进制, 十六进制前面加0x, 八进制后面加q

声明常量

使用 <name> equ <value> 的格式

变量声明和赋值部分 section .data

格式为 <variableName>  <dataType>  <initialiValue>

变量声明部分  section .bss

格式为 <variableName>  <resType>  <count>
其中, resType可以为 resb (8bit变量), resw (16bit变量), resd (32bit变量), resq (64bit变量), resdq (128bit变量)

代码部分 section .text

使用标准的程序连接器, 则必须包含声明

global _start
_start:

代码例子

; Simple example demonstrating basic program
; format and layout.
; ************************************************
;  Some basic data declarations
section  .data


;  Define constants
EXIT_SUCCESS     equ     0    ; successful operation
SYS_exit         equ     60   ; call code for terminate 

;  Byte (8­bit) variable declarations
bVar1            db      17
bVar2            db      9
bResult          db      0

;  Word (16­bit) variable declarations
wVar1            dw      17000
wVar2            dw      9000
wResult          dw      0

;  Double­word (32­bit) variable declarations
dVar1            dd      17000000
dVar2            dd      9000000
dResult          dd      0

;  Quad­word (64­bit) variable declarations
qVar1            dq      170000000
qVar2            dq      90000000
qResult          dq      0

; *************************************************************
;  Code Section
section  .text
global _start
_start:

;  Performs a series of very basic addition operations
;  to demonstrate basic program format.
;  Byte example
;     bResult = bVar1 + bVar2
mov              al, byte [bVar1]
add              al, byte [bVar2]
mov              byte [bResult], al

;  Word example
;  wResult = wVar1 + wVar2
mov              ax, word [wVar1]
add              ax, word [wVar2]
mov              word [wResult], ax

;  Double­word example
;     dResult = dVar1 + dVar2
mov              eax, dword [dVar1]
add              eax, dword [dVar2]
mov              dword [dResult], eax

;  Quadword example
;     qResult = qVar1 + qVar2
mov              rax, qword [qVar1]
add              rax, qword [qVar2]
mov              qword [qResult], rax

; ************************************************************
; Done, terminate program.
last:
mov              rax, SYS_exit   ; Call code for exit
mov              rdi, EXIT_SUCCESS  ; Exit program with success
syscall

 

.