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

.

Ubuntu x86-64汇编(1)的更多相关文章

  1. Ubuntu x86 64 settup nginx rtmp server

    常常搭建nginxserver,可是好像每次的情况都不同,这次具体记录这个过程: 平台:unbutu 10.04 内核:2.6.32-33-generic 1, 编译环境搭建. sudo apt-ge ...

  2. < IOS > X-code 5.1 x86 - 64 编译问题

    关于xcode 5.1   x86 - 64 编译问题   坐等了N久,终于IOS 7.1 发布了,作为一个果粉,忍不住第一时间升级了.结果用设备测试的时候,出问题了,一直检测不到设备,哈哈,纠结了半 ...

  3. Ubuntu Linux14 64位下在Android studio下用gradle编译Andrid项目时发生libz.so.1共享库找不到的解决方法。

    ---恢复内容开始--- 我在Ubuntu14 64为下安装了AS,但在用Gradle编译项目时总是报找不到 libz.so.1的错误. error while loading shared libr ...

  4. 一段简单c程序的汇编语言学习(ubuntu+x86)

    c程序代码: #include <stdio.h> int main(void) { int i=0, j=0; for(i=0; i<8; i++) j=j+1; return 0 ...

  5. ubuntu 32/64 bit

    https://askubuntu.com/questions/454253/how-to-run-32-bit-app-in-ubuntu-64-bit how to run 32-bit app ...

  6. Ubuntu上64位adv无法创建问题

    Ubuntu上安装android开发环境,前面都成功了,但到了最后创建adv的时候却总是失败. 出现了这个问题.最后,上网找了这个教程http://blog.sina.com.cn/s/blog_66 ...

  7. centos(x86 64位系统)使用boost

    1. 安装gcc,g++,make等开发环境 yum groupinstall "Development Tools" 2. 安装boost yum install boost b ...

  8. ubuntu 12 64 桌面版Oracle11g 安装

    1.Creating the Oracle Inventory Group sudo groupadd oinstall sudo groupadd dba sudo groupadd oper su ...

  9. Openfiler能把标准x86/64架构的系统变成一个强大的NAS、SAN存储和IP存储网关

    http://www.linuxprob.com/vmware-openfiler.html

  10. ubuntu 16 64位编译安装php

    ./configure \ --prefix=/usr/local/php7 \ --exec-prefix=/usr/local/php7 \ --with-config-file-path=/us ...

随机推荐

  1. input type=file 选择图片并且实现预览效果的实例

    为大家带来一篇input type=file 选择图片并且实现预览效果的实例. 通过<input />标签,给它指定type类型为file,可提供文件上传: accept:可选择上传类型, ...

  2. nodejs中thiskeyword的问题

    再分析详细内容之前,必需要好好阅读下面下面两篇blog 学习Javascript闭包(closure) Javascript的this使用方法 这两篇文章是阮一峰老师对Javascript的闭包和th ...

  3. Oracle选择性系统授权

    Selective System Grants 问题: 我只想授予XX用户alter system set user_dump_dest 权限! I want to give users the ab ...

  4. how to fix bug in daily work

    0 QE will begin test the product when system is stable. so they may log a lot of issues, and our dai ...

  5. RxJava RxBinding RxView 控件事件 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  6. TextureView SurfaceView 简介 案例

    简介 Android普通窗口的视图绘制机制是一层一层的,任何一个子元素或者是局部的刷新都会导致整个视图结构全部重绘一次,因此效率相对较低.视频或者opengl内容往往是显示在SurfaceView中的 ...

  7. 一款基于jQuery的图片场景标注提示弹窗特效

    今天给大家分享一款基于jQuery的图片场景标注提示弹窗特效,这款实例适合在图片上标注某个物件,单击弹出详情说明,兼容360.FireFox.Chrome.Safari.Opera.傲游.搜狗.世界之 ...

  8. 转:从头开始编写基于隐含马尔可夫模型HMM的中文分词器

    http://blog.csdn.net/guixunlong/article/details/8925990 从头开始编写基于隐含马尔可夫模型HMM的中文分词器之一 - 资源篇 首先感谢52nlp的 ...

  9. The application was unable to start correctly (0xc000007b)

    用VS2013建立了一个c++ console application,然后引用了一个DLL, 启动的时候报错: The application was unable to start correct ...

  10. 【Python】用geopy查两经纬度间的距离

    代码: from geopy.distance import vincenty from geopy.distance import great_circle 天安门 = (39.90733345, ...