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 (8bit) variable declarations
bVar1 db 17
bVar2 db 9
bResult db 0 ; Word (16bit) variable declarations
wVar1 dw 17000
wVar2 dw 9000
wResult dw 0 ; Doubleword (32bit) variable declarations
dVar1 dd 17000000
dVar2 dd 9000000
dResult dd 0 ; Quadword (64bit) 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 ; Doubleword 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)的更多相关文章
- Ubuntu x86 64 settup nginx rtmp server
常常搭建nginxserver,可是好像每次的情况都不同,这次具体记录这个过程: 平台:unbutu 10.04 内核:2.6.32-33-generic 1, 编译环境搭建. sudo apt-ge ...
- < IOS > X-code 5.1 x86 - 64 编译问题
关于xcode 5.1 x86 - 64 编译问题 坐等了N久,终于IOS 7.1 发布了,作为一个果粉,忍不住第一时间升级了.结果用设备测试的时候,出问题了,一直检测不到设备,哈哈,纠结了半 ...
- Ubuntu Linux14 64位下在Android studio下用gradle编译Andrid项目时发生libz.so.1共享库找不到的解决方法。
---恢复内容开始--- 我在Ubuntu14 64为下安装了AS,但在用Gradle编译项目时总是报找不到 libz.so.1的错误. error while loading shared libr ...
- 一段简单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 ...
- 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 ...
- Ubuntu上64位adv无法创建问题
Ubuntu上安装android开发环境,前面都成功了,但到了最后创建adv的时候却总是失败. 出现了这个问题.最后,上网找了这个教程http://blog.sina.com.cn/s/blog_66 ...
- centos(x86 64位系统)使用boost
1. 安装gcc,g++,make等开发环境 yum groupinstall "Development Tools" 2. 安装boost yum install boost b ...
- ubuntu 12 64 桌面版Oracle11g 安装
1.Creating the Oracle Inventory Group sudo groupadd oinstall sudo groupadd dba sudo groupadd oper su ...
- Openfiler能把标准x86/64架构的系统变成一个强大的NAS、SAN存储和IP存储网关
http://www.linuxprob.com/vmware-openfiler.html
- ubuntu 16 64位编译安装php
./configure \ --prefix=/usr/local/php7 \ --exec-prefix=/usr/local/php7 \ --with-config-file-path=/us ...
随机推荐
- vim粘贴代码的时候,恶心的缩进.
vim粘贴代码 如果有注释,那么粘贴后就惨不忍睹,类似于: 我粘贴代码到a.cpp,内容为: //打印函数 ) { ;i<length;i++){ ){ printf("0x &quo ...
- go语言之进阶篇并行和并发的区别与go语言并发优势
1.并行和并发的概念 并行(parallel):指在同一时刻,有多条指令在多个处理器上同时执行. 并发(concurrency):指在同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行,使得在 ...
- Spring Boot 集成Shiro和CAS
Spring Boot 集成Shiro和CAS 标签: springshirocas 2016-01-17 23:03 35765人阅读 评论(22) 收藏 举报 分类: Spring(42) 版 ...
- nodejs pipe实现大文件拷贝
原文: http://nqdeng.github.io/7-days-nodejs/ --------------------------------------------------------- ...
- Java-JUC(三):原子性变量与CAS算法
原子性 并发程序正确地执行,必须要保证原子性.可见性以及有序性.只要有一个没有被保证,就有可能会导致程序运行不正确. 原子性:一个操作或多个操作要么全部执行完成且执行过程不被中断,要么就不执行. 可见 ...
- 与IE的战斗
对第2版的改进,工作量几乎都在UI上,不断的写css,写js,还别说,总体挺愉快的.特别是把360浏览器用顺了之后,烦人的无法刷新问题也不能困扰我了,改了js或者css文件的话,只要清除一下缓存,就可 ...
- express统一输出404页面
不玩不知道,一玩吓一跳,还真是,nodejs全局404怎么搞? 直接,res.render("404.html")有可能会报错:Node.js : Cannot find modu ...
- 关于Spring mvc 一次请求Controller执行两次的问题
资源路径为空时也会导致重复请求.< span style="background-image:url('');" >相关推荐< /span >,此时就会出现 ...
- BAT,你好!字幕组,再见!——也许要跟美剧说再见了~
对于美剧迷来说,上周的星期六(2014 年11 月 22 日)是黑色的一天. 11 月 22 日,人人影视暂时关站,并发布公告称网站正在清理内容.虽然这不是人人影视第一次关站清理,而且人人影视还给出提 ...
- js escape 与php escape
javascript有编码函数escape()和对应的解码函数unescape(),而php中只有个urlencode和urldecode,这个编码和解码函数对encodeURI和encodeURIC ...