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 ...
随机推荐
- C++ 模板学习 函数模板、类模板、迭代器模板
使用模板能够极大到使得代码可重用. 记录一下,方便后续使用. 1. 函数模板,支持多种类型参数 #include <stdio.h> #include <math.h> //函 ...
- SharePoint 2013 基于表单 Membership 的身份验证
其实关于SharePoint 2013 表单身份验证网上已经有很多了,比如SharePoint 2013自定义Providers在基于表单的身份验证(Forms-Based-Authenticatio ...
- easyui +ASP.NET 前后台乱码解决方法
前端接口 decodeURIencodeURI 后台接口 System.Web.HttpUtility.UrlEncode(user.name) 凡是涉及到中文的地方都要使用这几个接口
- Minimum Path Sum leetcode java
题目: Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right w ...
- Oracle数据库将varchar类型的字段改为clob类型
alter table pwlp_accuse_info modify INSTRUCTION_STYLE long; alter table pwlp_accuse_info modify INST ...
- 【Spark】SparkStreaming-Tasks-数量如何设置?
SparkStreaming-Tasks-数量如何设置? sparkstreaming task 数量设置_百度搜索 spark内核揭秘-14-Spark性能优化的10大问题及其解决方案 - star ...
- 浅谈APP流式分页服务端设计(转)
http://www.jianshu.com/p/13941129c826 a.cursor游标式分页 select * from table where id >cursor limit pa ...
- CreateFont函数为什么改变不了字体?该怎么解决
CreateFont函数为什么改变不了字体?CFont * f; f = new CFont; f-> CreateFont( ...
- OpenGL ES3.0
到今天,喜欢上了非常酷的图片处理和游戏,经了解,大部分都要使用opengl es,所以准备开始学习,然后深入学习cocos2d,GPUImage.平台为IOS OpenGL ES OpenGL ES ...
- WPF加载HTML、WPF与JavaScript交互
目录 一.WebBrowser加载远程网页 二.WebBrowser加载本地网页,注:不可以加载本地样式CSS和脚本JS文件 三.WebBrowser隐藏网页的JavaScript错误 四.网页屏蔽鼠 ...