第3章 寻址方式和指令系统(创新142)综述
第3章 寻址方式与指令系统;先看一个例子例:;
#include stdio.h
int main(int argc, char* argv[])
{ int a,b,c;
a=1;
b=2;
c=a+b;
printf(“c=%d\n,c);
return 0;
}
;
data segment
a db ?
b db ?
c db ?
string db c=$
data ends
code segment
main proc far
assume cs:code, ds:data, es:data
start:
push ds
sub ax,ax
push ax
mov ax,data
mov ds,ax
mov es,ax ;指令构成;指令中的操作码和操作数;寻址方式;数据寻址 ;3.1 寻址方式;3.1.1 立即数寻址
例3-1立即数寻址
MOV AX,2004H
;(AH)=20H,(AL)=04H
MOV BL, 5AH ;(BL)=5AH
MOV EAX
;(EAX), (AX)=4455H
立即数常用于给寄存器赋初值,只能作源操作数,不能作目的操作数 ;3.1.2 寄存器寻址
操作数存放在指令指定的8位、16位或32位通用寄存器中。
对于16位的操作数,寄存器可以是AX、BX、CX、DX、SI、DI、SP和BP等;EA = Ri;3.1.2 寄存器寻址
例3-2 寄存器寻址
MOV AX,BX
; 将BX中的内容送入AX中, BX中的内容保持不变
MOV SI,DI
;将DI中的内容送入S I中, DI中的内容保持不变
MOV EAX,EBX
;将EBX中的内容送入EAX;3.1.3 直接寻址
直接寻址指的是操作数在存储器中的有效地址EA直接包含在指令中,书写时有效地址加上中括号 ;3.1.3 直接寻址
例3-3 存储器直接寻址
MOV AX,[1000H]
;将DS段的1000H和1001H两个 单元的内容送入AX寄存器中
MOV EAX,ES:[2000H] ;将ES段的2000H~2003H四个单元的内容送入EAX寄存中,其中ES为段超越前缀
MOV AX,BUF
;将DS段内以有效地址BUF(符号地址)起始的两个单元的内容送入AX寄存器中;间接寻址;;3.1.4 寄存器间接寻址
操作数的有效地址EA存放在基址寄存器BX、BP,或变址寄存器SI、DI中
如果指定的寄存器是BX、SI、DI,则操作数默认在数据段中;如果使用BP,默认在堆栈段中
允许段超越。
书写时对间接寻址的寄存器加上中括??。
操作数的物理地址为:
(DS)×16+(SI/DI/BX)
或(SS)×16+(BP);EA = ( Ri );例3-4 寄存器间接寻址,假定(DS)=2000H,(SI)=3600H,(23600H)=6022H
MOV AX,[SI]
;先将DS中的值左移4位,然后与SI中的值相加, 形成物理地址是23600H,再将该物理地址中的 数据6022H送入AX寄存器中
例3-5 寄存器间接寻址,假定(SS)=3000H,(BP)=1100H,(31100H)=5E28H
MOV BX,[BP]
;先将SS中的值左移4位,然后与BP中的值相加, 形成物理地址31100H,再将该物理地址中的
原创力文档

文档评论(0)