关键词:
寻址方式
所谓寻址方式就是表示指令中数据所在地址的方式。一共有七种寻址方案
立即数寻址
寄存器寻址
直接寻址
寄存器间接寻址
寄存器相对选址
基址变质寻址
相对基址变质寻址
在此之前,先介绍一个数据复制指令 MOV 指令, 格式是 MOV AX, BX 。 AX, BX是寄存器上一章介绍过的MOV就是指令。 指令的含义就是将BX的值复制给AX。C语言的表述就是AX=BX;
举个例子 如果一开始 AX=5; BX=0;
MOV AX,BX 之后 AX = BX 都是0;
立即数寻址 / 寄存器寻址
MOV AX, 1 ; AX = 1
立即数寻址,我觉得称不上寻址,因为他给出的不是地址,而就是实际的数字,上面的命令中 1 就是立即数,而AX就是寄存器寻址所以寄存器寻址就是直接使用寄存器,数据直接存入指定的寄存器
寄存器寻址可以使用的寄存器是AX(AL AH) BX(BL BH) CX(CL CH) DX(DL DH) SI DI SP BP等, 这些寄存器可以任意组合,举例如下
MOV AX, BX ; AX = BX
MOV BX, AX ; BX =AX
MOV SI, DI ; SI = DI
MOV DI, SI ; DI = SI
这两种寻址方式是不涉及内存的操作的,所以速度是最快的,所以为了性能考虑应该尽量多的使用这两种寻址方式的操作。
注意: MOV 1, AX 是非法的,应为1就是常数,你不能给常数赋值
直接寻址
MOV AX, [1234H]
MOV AX, ES:[1234H]
直接寻址就是直接给出内存地址的寻址方式,格式是 段寄存器:[偏移地址] 偏移地址是立即数,用[]括起来。当然也可以直接省去前面的段寄存器写作 [偏移地址],这样汇编会自动选择一个默认的段地址,一般来说是DS段寄存器。前面讲过内存地址是 段地址X16+偏移地址,所以使用段寄存器:[偏移地址] 给出的地址就是 段寄存器的值X16 + 偏移地址,
举例
MOV AX, DS:[1234H]
这句话的就是将DSx16+1234H处的数据复制给AX寄存器,假设DS=5000H 那么就是将内存51234处的数据复制给AX,具体是多少就要看当时内存中是什么数据了。
MOV AX, ES:[1234H]
就是显示指定了使用的ES段寄存器,所以就是将ESx16+1234H处的数据复制给AX
注意 ":"前面只能跟着段寄存器 DS ES SS CS寄存器
这一条寻址方式其实是最基础的寻址方式,接下来的其他几种寻址方式都是只是[]中偏移地址的表示方式发生了一些变化而已。
寄存器间接寻址
MOV AX, [BX]
MOV AX,CS:[BX]
本质上和直接寻址是没太大区别的,唯一的区别就是在直接寻之中[]中的数据是直接给出的,但是在寄存器间接寻址中这个数字是存储在寄存器中而已。
这里有个限制就是[] 中能使用的寄存器只有 BX BP SI DI ,如果使用的是BX SI DI则默认的段寄存器是DS,如果是BP寄存器则默认使用SS寄存器。
当然如果特意指定寄存器那么就用指定的寄存器。
举例 AX =1 BX = 1111H DS = 5000H
MOV AX, [BX] ; 等于MOV AX,DS:[1111H] 就是将51111H内存出的数据复制到AX中
寄存器间接寻址
MOV AX, [BX + 1111H]
在寄存器间接寻址的基础上加上立即数其他规则还是和寄存器间接寻址一样的
举例 AX =1 BX = 2222H DS=5000H
MOV AX, [BX + 1111H] ; 等于 MOV AX, DS:[2222H + 1111H] => MOV AX, DS:[3333H]
基址变址寻址
MOV AX,[BX+SI]
基址变址寻址就是用了两个寄存器 {BX/BP}+{SI/DI}, 如果是出现BP寄存器则默认使用SS寄存器,否则默认使用DS寄存器.规则和寄存器间接寻址也是一样的。
要注意的是这里分为两组了寄存器 BX/BP 和SI/DI,一组中只能出现一个,即不能出现[ BX+BP ] 和 [SI+DI],从名字中就可以看出的 基址+变址,
BX 基地址寄存器
BP 基址指针寄存器(Base Point)
SI 源地址寄存器(Source Index)
DI 目的地址寄存器(Destination Index)
举例 AX =1 BX=1111H SI=2222H DS= 5000H
MOV AX,[BX+SI]; 等于 MOV AX, DS:[BX+SI] => MOV AX, DS:[1111H+2222H] => MOV AX, DS:[3333H]
相对基址变址寻址
MOV AX,[BX+SI+4444H]
可以看出就是在基址变址寻址的基础上加上了立即数其他规则不变
举例 AX =1 BX=1111H SI=2222H DS= 5000H
MOV AX,[BX+SI+4444H]; 等于 MOV AX, DS:[BX+SI+4444H] => MOV AX, DS:[1111H+2222H+4444H] => MOV AX, DS:[7777H]
总结:
在我看来其实就三种寻址方式
1. 立即数寻址 MOV AX, 1 直接给出数据
2. 寄存器寻址 MOV AX, BX 地址是寄存器
3. 内存寻址 MOV AX, 段寄存器 : [地址]
地址使用 [] 括起来,[] 中的结果就是数据在内存中的偏移地址,[] 可以使用两组寄存器 (BX/BP 和 SI/DI) 和 立即数的任意组合,同组寄存器不能同时出现,段寄存器如果不指定则如果出现了BP寄存器就默认使用SS段寄存器否则默认使用DS寄存器
寄存器间接寻址 = [ 只用一个寄存器]
寄存器相对选址 = [用一个寄存器+立即数]
基址变质寻址 = [用两个寄存器]
相对基址变质寻址 = [用两个寄存器+立即数]
写个公式就是 [地址] = [ {BX | BP | 空} + {SI | DI | 空} + {立即数 | 空} ]
其实这些寻址方式在使用汇编写代码的时候都是有对应的使用场景的,这个在以后会介绍的。
x86-64汇编学习1(代码片段)
前言熟悉一些关键字可以更方便看懂官方的手册:IA-32(Intelarchitecture-32):指代因特尔32位处理器架构。X86-64:64位处理器架构compatibility(兼容模式):在64位下运行IA-32程序或者模式内存范围我们知道我们的32位程序寻址范围为2^32=4G内... 查看详情
80x86的指令都有哪些寻址方式
参考技术A直接寻址间接寻址寄存器寻址寄存器间接寻址四种本回答被提问者和网友采纳 参考技术B我也不熟悉这地方 查看详情
x86---32汇编---内存寻址模式(代码片段)
内存寻址在汇编中非常重要,主要有一下几种: 1.基于寄存器寻址: 2.基于寄存器+偏置 3.基于寄存器+索引寄存器; 4.基于寄存器+scale*索引寄存器;代码:#include<stdio.h>#include<tchar.h>extern"C"intNumFibVals_;... 查看详情
汇编笔记三寻址公式
一、寻址方式一: 立即数寻址:[立即数] 例: 读取内存的值: MOVEAX,DWORDPTRDS:[0xFFFFFFFF] 向内存中写入数据: MOVDWORDPTRDS:[0xFFFFFFFF],eax 获取内存地址: LEAEAX,DWORDPTR:DS[0xF... 查看详情
汇编指令学习(寻址方式)
一、直接寻址后面直接跟着内存地址push0x46B995jmp0x0046B999call0x0046B99A二、间接寻址只有运行到当前指令,才知道具体的地址是多少pusheaxcallebx 查看详情
基于转换的索引模式到间接寻址模式(x86 汇编)
】基于转换的索引模式到间接寻址模式(x86汇编)【英文标题】:Transformbasedindexedmodetoindirectaddressingmode(x86assembly)【发布时间】:2015-04-0717:33:48【问题描述】:我在Ubuntu上使用x86AT&T程序集。我需要将任何复杂的间接寻址模式... 查看详情
操作系统学习80x86保护模式内存管理
整理的不好,凑合着看吧目录1.内存及寻址2.地址变换3.分段机制4.分页机制5.保护6.去到底部一、内存及寻址返回目录二、地址变换80X86从逻辑地址到物理地址的转换:第一阶段是使用分段机制把程序的逻辑地址变换成处理器可寻... 查看详情
at&t汇编学习笔记
file命令使用介绍file最常用的场景就是用来查看可执行文件的运行环境,是arm呢,还是x86呢,还是mips呢?一看便知$filea.outa.out:ELF64-bitLSBexecutable,x86-64,version1(SYSV),dynamicallylinked(usessharedlibs),forGNU/Linux2.6.24,BuildID[sha1]=0xa240b195 查看详情
汇编寻址方式记录
x86/amd64汇编指令的两大风格分别是Intel汇编与AT&T汇编,分别被MicrosoftWindows/VisualC++与GNU/Gas采用(Gas也可使用Intel汇编风格):项目Intel风格AT&T风格操作数顺序目标操作数在前源操作数在前寄存器原样加%前缀立即数原样加$前... 查看详情
x86汇编如何查看一个地址的值
...esp+4指向的地址中的值移动到ax寄存器中,依此类推。①汇编指令后面跟有操作数长度的后缀,比如mov指令,如果操作数是8位,则用movb,如果操作数是16位,则用movw,如果操作数是32位,则用movl,如果操作数是64位,则用movq,其... 查看详情
汇编小笔记
关于地址:不同的段都作为数据储存在内存中,如果要找到特定段里的数据地址,可以把段名赋值给数据段寄存器,这样就可找到数据段的首地址。关于数据:若把字符串以‘.....‘的形式储存,则在内存中会以ascii码的形式储... 查看详情
android逆向基础之arm汇编语言知识总结(代码片段)
文章目录前言ARM32汇编1.1寄存器1.2寻址方式1.3汇编指令1.4代码识别1.5IDA示例ARM64汇编2.1寄存器2.2变址寻址方式2.3常用汇编指令2.4实例程序分析总结前言X86是英特尔Intel首先开发制造的一种微处理器体系结构的泛称,包括Intel8086... 查看详情
汇编实验九
...2.理解80×25彩色字符模式显示原理3.综合应用寻址方式和汇编指令完成应用编程二、实验准备1.复习数值和数字字符之间的转换方法,div指令用法2.学习P187-189支撑材料及「实验9提示」(本文档最后一部分)3.复习灵活的寻址方式... 查看详情
汇编实验9
...2.理解80×25彩色字符模式显示原理3.综合应用寻址方式和汇编指令完成应用编程二、实验准备1.复习数值和数字字符之间的转换方法,div指令用法2.学习P187-189支撑材料及「实验9提示」(本文档最后一部分)3.复习灵活的寻址方式... 查看详情
x86/x64 添加置换寻址
】x86/x64添加置换寻址【英文标题】:x86/x64AddDisplacementaddressing【发布时间】:2012-11-1108:17:36【问题描述】:我正在为x86/x64CPU指令编写编译器,但我似乎无法弄清楚人们所说的“位移”地址是什么意思。例如,此处详细说明了添... 查看详情
6.828学习笔记2-qemu和x86汇编语言
...对于我这种小白用户,需要熟悉的更多。 1、x86汇编语言 果然,课程首先让我熟悉汇编语言,并提供了两份参考文献。虽然我对汇编语言离熟悉还差十万八千里,不过好歹是用过的。我感到如果想要保持学习的... 查看详情
80x86汇编mul乘法指令(代码片段)
使用mul做乘法的时候,注意以下两点:两个相乘的数:两个相乘的数,要么都是8位,要么都是16位.如果是8位,一个默认放在AL中,另一个放在8位reg或内存字节单元中;如果是16位,一个默认再AX中,另一个放在16位reg或内存子单元中.结果:如果... 查看详情
学习笔记--heartbeat
Heartbeat server6server7安装包:heartbeat-3.0.4-2.el6.x86_64.rpmheartbeat-libs-3.0.4-2.el6.x86_64.rpmheartbeat-devel-3.0.4-2.el6.x86_64.rpmldirectord-3.9.5-3.1.x86_64.rpm rpm-qheartbeat-d 查 查看详情