zoukankan      html  css  js  c++  java
  • Ubuntu x86-64汇编(1)

    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
    

    .

  • 相关阅读:
    【leetcode】319. 灯泡开关
    【leetcode】313. 超级丑数
    【leetcode】316. 去除重复字母
    kpw3 kindle越狱过程总结
    SpringBoot工程application.properties文件不识别问题
    mybatis初始配置及错误说明
    运维相关知识
    面试常见
    Bean method 'jdbcTemplate' not loaded because @ConditionalOnSingleCandidate
    mysql5.7.21安装要点记录
  • 原文地址:https://www.cnblogs.com/milton/p/9030624.html
Copyright © 2011-2022 走看看