汇编语言知识点总结

8086字读取过程

  • 一个字占用两个字节(16位)
  • 低位字节存入低地址,高位字节存入高地址(小端对齐方式)。
  • 字单元地址用它的低地址表示。
  • 机器以偶地址来访问存储器。

寻址方式(参考:https://blog.csdn.net/jianbai_/article/details/90174254

根据操作数的种类分为两大类,即数据寻址方式和地址寻址方式。

基本概念

(1)寄存器

(2)EA(有效地址)

操作数相对于段首的偏移地址。其中有效地址由三种地址分量组成:
1)位移量:存放在指令中的8位或者16位的数,即地址;
2)基址:存放在基址寄存器BX或者BP中的内容;
3)变址:存放在变址寄存器SI或者DI中的内容

数据寻址方式

(1)立即数寻址方式
立即数:立即数寻址方式所提供的操作数直接包含在指令中,紧跟在操作码之后,它作为指令的一部分,这种操作数就称为立即数。
例如,MOV ax,1234H
(2)寄存器寻址方式
寄存器寻址方式的操作数就存放在指令规定的寄存器中,寄存器的名字在指令中指出。对于16位操作数,寄存器可以有AX,BX,CX,DX,SI,DI,SP,BP;对于8位操作数,寄存器可以有AH,AL,BH,BL,CH,CL,DH,DL。
例如,MOV ax,bx
(3)存储器寻址方式(5种)

1)直接寻址方式:直接寻址方式的操作数有效地址只包含位移量一种分量,即在指令的操作码后面直接给出有效地址(EA=位移量),一般来说,如果没有明确给出段寄存器名称,则默认在数据段中(DS为数据段的寄存器),如果需要实现段超越,此时需要在指令中指出要用到的段寄存器。(其中[ ]括起来的整体代表地址)
例如,MOV ax,[1234H];MOV ax,es:[1234H]


2)寄存器间接寻址方式:寄存器间接寻址方式的操作数有效地址包含基址寄存器BX的内容或者变址寄存器SI,DI的内容的一种分量,即操作数的有效地址在某个寄存器中。书写时,用作间址的寄存器必须加上“[ ]”,避免和一般的寄存器的寻址方式混淆。
例如,MOV ax,[bx]


3)寄存器相对寻址方式:寄存器相对寻址方式的操作数有效地址是一个基址寄存器(BX,BP)或变址寄存器(SI,DI)的内容+指令中给定的8位或16位位移量,即有效地址由两种分量组成。一般情况下,如果指令中的寄存器是BX,SI,DI,则对应的段地址默认是DS,如果是BP,则对应的段地址默认是SS。同样的,寄存器相对寻址方式也允许段超越。其中位移量可以是一个8位或者16位的立即数,也可以是符号地址。(注:这里不能同时是SI、DI或BX、BP)
例如,mov ax,1234h[si]


4)基址变址寻址方式:基址变址寻址方式的操作数有效地址是一个基址寄存器(BX,BP)和一个变址寄存器(SI,DI)的内容之和,即有效地址由两种分量组成。
例如,mov ax,[bx][si]


5)基址变址相对寻址方式:基址变址相对寻址方式的操作数有效地址是一个基址寄存器与一个变址寄存器的内容和指令中给定的8位或16位位移量之和,即有效地址由三种分量组成。
例如,mov ax,1234H[bx][si]


(4)I/O端口寻址方式(2种)
1)端口直接寻址方式:这种寻址方式的端口地址用8位立即数(0~255)表示。
mov ax,21H
2)端口间接寻址方式:当I/O端口的地址大于FFH时,一定要事先将端口地址放在DX寄存器中。

mov dx,272
OUT dx,ax

地址寻址方式

(1)段内直接寻址方式(也称为:相对寻址方式)
转移地址是当前的IP内容和指令规定的下一条指令到目标地址之间的8位或16位的相对位移量之和(相对位移量可正可负)。
(2)段内间接寻址方式
该寻址方式是将转移地址存放在寄存器或者存储单元中(存储器可用各种数据寻址方式表示)。指令操作的实质是利用寄存器或者存储单元中的值替换当前IP中的内容,实现段内转移的功能。
(3)段间直接寻址方式:在指令中直接用16位的段地址和16位的偏移地址来修改当前的CS:IP,实现段间直接寻址。
(4)段间间接寻址方式:由指令中给出的存储器寻址方式求出存放转移地址的四个连续存储单元的地址。指令的操作是用存储器的前两个单元的内容修改IP,后两个单元的内容修改CS,从而实现段间转移。

指令对标志位的影响

标志位 名称 置值
OF 溢出
CF 进位
SF 正负 判断第一位的符号
ZF 判0 =0为1,≠0为0
PF 奇偶 奇数个1为0,偶数个1为1

(1)MOV是传送类指令,不影响标志位
(2)SHL指令将影响CF和OF两个标志位。如果移位次数为1,且移位后的符号位的值发生变化,则OF=1,否则OF=0.如果移位次数不为1,则OF的值不确定。

默认的段地址

指令中的寄存器是BX,SI,DI,则对应的段地址默认是DS,如果是BP,则对应的段地址默认是SS。

常见注意点

(1)8086CPU不支持直接将数据送入段寄存器的操作,所以段寄存器只能经过其他寄存器作为中转寄存器,再载入值;
(2)CS不可以直接赋值,这个段寄存器的值要由系统设置。其他的DS、ES、SS都可以用MOV赋值,但不能用立即数。
(3)push pop 只对字操作(不允许字节进栈)操作数长度为32位时进出栈为双字。
(4)汇编语言中PUSH导致SP减2而不是加2。原因:栈在内存中实际存储结构是栈底在高地址,栈顶在低地址
(5)8086push不可以使用立即数寻址方式(其他版本允许)
(6)pop不可以使用立即数寻址方式,使用段寄存器时不可使用CS段寄存器。

问题

VAR是数据段中定义的字变量,指令MOV AX,VAR中源的操作数的寻址方式是()
答:直接寻址。
那, MOV AX,VAL[BX][DI]呢?

猜你喜欢

转载自www.cnblogs.com/code-fun/p/12898143.html