汇编--学习笔记(二)-寻址方式
来源:互联网 发布:刘雨晴淘宝卖假货 编辑:程序博客网 时间:2024/05/21 08:52
一、指令系统
一组指令的集合
二、寻址方式
取得操作数地址的方式
三、指令格式
1、形式 [标号] 操作码 [目标操作数] [,源操作数] [;注释]
- 标号 :是一个符号
- 操作码:是一个操作码助记符,它可以是指令、伪操作或宏指令名。它是汇编指令的关键字,指出该指令做什么。
- 目标操作数:指出指令的处理结果置于何处。
- 源操作数:指出指令的处理对象来源何处。它绝不存放结果。
- 注释:注释用于说明程序或语句的功能。
- 指令结束:用回车表示。
操作数
1、立即数(数学中的常数)
- (1)作为代码指令的一部分出现在双操作数指令中;
- (2)除了乘法、除法和字符串指令外,立即数均可作为源操作数;
- (4)书写可以为2、8、10、16进制
- (5)用16进制书写时,若第一个字符非数字0-9,则前面一定补一个0.
2、寄存器
- (1)寄存器操作数是指寄存器的内容参加运算,或用寄存器存放结果;
- (2)段寄存器:CS、DS、SS、ES指出当前4个段的地址,故不能用一般指令将立即数送入。
- 应先将立即数值送到AX,再用AX送入DS、SS、ES。
- CS一般不需要人工干预,因为与地址有关。
- (3)FLAG标志寄存器
- 一般不能作为操作数,但可以用标志指令如INC、DEC、MUL、ADD等处理。
- (4)通用、指针和变址寄存器
- AX、BX、CX、DX、BP、SI、DI等均可参加算术和逻辑运算;
- 虽然经常用AX作为累加器(AX的速度快一些),但实际上所有通用寄存器均可;
- (5)寄存器作为隐含操作数
- 某些指令虽然没有显式地写有寄存器,但它隐含使用某寄存器;例如:AAA,隐含AL
3、内存
- (1)是把内存某地址的字节、字或双字作为操作数;
- (2)要求使用前必须指出其所在段和相对段首的位移;
- (3)内存操作数所在段的段寄存器的名字,在汇编指令中一般是不写的。它遵循着下面的隐含原则:
4、寻址规则
分为4大类(固定、立即、直接、间接)9小类:
- 1、固定寻址
- 2、立即数寻址
- 3、寄存器直接寻址
- 4、寄存器间接寻址
- 5、存储器直接寻址
- 6、变址寻址
- 7、基地址加变址寻址
- 8、数据串操作数的寻址
- 9、I/O端口寻址
1、固定寻址
隐含对固定目标的寻址。例如:AAA ;加法的ASCII码调整
隐含使用AL寄存器,即采用对AL寄存器进行固定寻址,被调整的数位于AL中。这一类指令多为对应的单字节指令。
2、立即数寻址
操作数是一个数。可为2、8、10、16进制。例如:MOV AX,0ABH ;送数值到寄存器(16进制若首位是字母,则加0)
说明:(1)立即数可以是字节或字、常数。
(2)只能作为源操作数
3、寄存器直接寻址
寄存器的内容就是操作数。使用时只需要写上寄存器的名字。
例如:
MOV AX,0ABH ;送数值到寄存器ADD AX,BX ;寄存器加运算PUSH DS ;数据段寄存器入栈
说明:(1)通用寄存器、指针及变址寄存器均可作为源、目标操作数,用于寄存器直接寻址;
(2)虽然任何数据寄存器均可参加算术及逻辑运算,但建议尽量使用AX寄存器,因为AX作为累加器存放其结果,则指令码最短。
4、寄存器间接寻址
- (1)寄存器的内容是操作数的地址;
- (2)寄存器只可以是:SI、DI、BX、BP中的其中一个。
- (3)书写及使用时相应寄存器名字用“[ ]”括起来,表示该寄存器的内容为EA。例如:
MOV AX,[BX] ;BX内容为操作数的地址
- (4)地址的形成:(段寄存器)*10H+(寄存器)
- SI、DI、BX:默认段寄存器为DS
- BP:默认寄存器为SS
引用上例:(DS)*10H + (BX)
5、存储器直接寻址
就像高级语言中的“变量”。
(1)是指有效地址EA直接可用代码指令中某一字段得到,它可以是以字节或字表示的位移。用disp表示。
MOVVA DB 20H ;定义一个字节变量;VA 就是一个变量名;DB 中的B代表这是一个字节类型的变量;DW 代表一个字类型的变量;DD 代表双字类型的变量MOV AL,VA ;送内存数到寄存器。其中VA--位移
(2)书写形式类似于立即数寻址。必须从整个程序上下文分析才能得出正确结论。
(3)物理地址构成:(DS)*10H+disp—–其中disp表示位移量
(4)段超越
可以不使用数据段寄存器DS,但需在disp前写上寄存器名字,然后加一冒号(:),以代替隐含的段寄存器。例如:
MOV AX,ES:[BX] ;ES叫做段前缀操作,段基由ES给,BX就是间接寻址的道理
6、变址寻址
(1)定义:是指使用SI、DI、BX、BP与直接位移量disp构成的存储器寻址方式。
(2)地址形成:
(段寄存器)*10H+(寄存器)+disp
即寄存器间接寻址计算出的EA后再加上disp
(3)书写形式
[BX] + disp
disp[BX]
[BX + disp]
三者含义相同,其中BX可以是SI、DI、BX和BP
例如:
MOV AX,[DX+A1] ;送数至寄存器EA形成:(DS)*10H + (DI) + A1
7、基址加变址寻址
(1)定义:以BX和BP为基址寄存器,而以SI和DI为变址寄存器,形成的存储器寻址方式。
(2)有效地址形成:
EA = (基址寄存器) + (变址寄存器)[+ disp]
(3)操作数形式
例如:
[BX +SI]+disp
disp[BX][SI]
[BX+SI+disp]
三者含义相同
[BX+DI] +disp
[BP + SI] +disp ;各种寻址方式,只要有BP,通常是指对堆栈段操作
[BP + DI] +disp
MOV AX,[BX+DI+A1] ;送数至寄存器EA形成:(DS)*10H+(BX)+(DI)+A1
8、数据串操作数的寻址
(1)串操作指令不同于其它指令,它使用隐含的变址寄存器来寻址,且操作过程中自动修改寄存器内容以指向下一步操作的地址。
(2)修改分两种:自动增或自动减。
取决于FLAG的标志DF:
DF = 1:自动减
DF = 0:自动增
(3)有效地址形成:
对源操作串:EA = (SI),段的基地址由DS指定
对目标串: EA = (DI),段的基地址由ES指定
9、I/O端口寻址
对分配在I/O空间中的端口有2种寻址方式:
(1)直接端口寻址
端口号可以是8位的立即数(0~255)
(2)简介端口寻址
端口号必须事先存放在寄存器DX中,可以是16位数(0~65525)。
例如:
OUT 21H,AL ;AX内容送21H号端口MOV DX,1250 OUT DX,AL ;AL内容送1250H号端口
输出Hello World字符串汇编代码!
DATAS SEGMENT STRING DB 'hello yuanlifu!!','$';显示字符串DATAS ENDSCODES SEGMENT ASSUME CS:CODES,DS:DATASSTART: MOV AX,DATAS MOV DS,AX LEA DX,STRING MOV AH,9 INT 21H MOV AH,4CH INT 21HCODES ENDS END START
输出字符串的另外一个方法
DATA SEGMENT HM DB 'hello liefyuan!',0DH,0AH,'$';显示字符串DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATAGO PROC FAR PUSH DS MOV AX,0 PUSH AX MOV AX,DATA MOV DS,AX MOV DX,OFFSET HM MOV AH,9 INT 21H RETGO ENDPCODE ENDS END GO
- 汇编--学习笔记(二)-寻址方式
- 汇编寻址与消除歧义 -- 汇编学习笔记(二)
- 汇编学习(二)内存地址及寻址方式
- 寻址方式——汇编学习笔记(三)
- 8086汇编学习笔记6-寻址方式
- arm学习笔记二(arm寻址方式)
- 汇编学习笔记--更灵活的寻址方式
- 关于OD破解汇编基础知识(二)--寻址方式
- Linux下汇编学习-3寻址方式
- 汇编 寻址方式总结
- [汇编]8086寻址方式
- 汇编寻址方式总结
- 汇编 寻址方式总结
- 汇编寻址方式
- ARM汇编--寻址方式
- 汇编-寻址方式
- 汇编的寻址方式
- 汇编寻址方式总结
- Java 试题二
- Codeforces Round #415 (Div. 2) A. Straight «A»
- 解压rpm包
- iOS与js交互
- 在Android中使用SVG图遇到的坑
- 汇编--学习笔记(二)-寻址方式
- Java 试题三
- Ninja 构建系统
- 【Docker】Docker基础
- Java8系列之重新认识HashMap
- tomcat设置快速启动
- python获取文件修改时间与创建时间
- A^B的所有约数和
- 自己对JAVA public,protected,default,private的理解。