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 ...
随机推荐
- 【转】QT 串口QSerialPort + 解决接收数据不完整问题
类:QSerialPort 例程:Examples\Qt-5.9.1\serialport\terminal,该例子完美展示了qt串口收发过程,直接在这上面修改就可以得到自己的串口软件.核心方法 // ...
- [置顶] Linux下将Nutch1.3导入eclipse
1.准备工作 首先去官网下载好 apache-nutch-1.3-bin.zip 解压apache-nutch-1.3-bin.zip [pig@CentOs ]$ unzip apache-nu ...
- Commands to help you to Start Using ScaleIO Storage
To start using your storage: Log in to the MDM: scli --login --username admin --password <passwor ...
- 谷歌(Google)被墙,解决地图和字体无法显示的问题
首先,本文以及本站所有文章都是技术探讨文章,不鼓励任何人去fan qiang以及做任何违法的事情.接下来是正文: 谷歌基本上是被和谐透了,谷歌地图API自然也打不开了,于是公司网站上那些谷歌地图都变成 ...
- php随机生成汉字实现方法
GB 2312-80 是中国国家标准简体中文字符集,全称<信息交换用汉字编码字符集·基本集>,由中国国家标准总局发布,1981年5月1日实施.GB2312 编码通行于中国大陆:新加坡等地也 ...
- Spring(十三):使用工厂方法来配置Bean的两种方式(静态工厂方法&实例工厂方法)
通过调用静态工厂方法创建Bean 1)调用静态工厂方法创建Bean是将对象创建的过程封装到静态方法中.当客户端需要对象时,只需要简单地调用静态方法,而不需要关心创建对象的具体细节. 2)要声明通过静态 ...
- eclipse中的项目鼠标右键卡死
1.错误描写叙述 在eclipse中部署了Java Web项目,想在WebContent目录下新建一个目录,鼠标右键时出现eclipse卡死的想象 2.错误原因 (1)插件安装过多 (2)导入的项目过 ...
- CMenu and Dialog-based applications
[问] Is it possible to put a menu in a dialog based application? How? [答] Yes, it is possible to add ...
- 如何检查显卡类型,DirectX和OpenGL的版本
How To: Check the graphics card type and OpenGL version From: http://support.esri.com/technical-arti ...
- Solidworks如何替换工程图参考零件
不要在左侧树形图右击修改 而是要在右侧主视图上右击,替换模型 左侧浏览找到新的零件,然后打开 替换完成之后,会有一些尺寸变成黄色,只需要改动黄色部分即可,不需要每个尺寸重新标注