汇编语言——八个寻址方式

指令和指令系统

指令:控制计算机完成某种操作的命令

指令系统:处理器能识别的所有指令的集合

指令的兼容性:同一系列机的指令是兼容的

指令的包含的内容:

  • 运算数据的来源
  • 运算结果的去向
  • 执行的操作

指令格式:

操作码操作数,操作数操作码[操作数],[操作数]

注意:[]表示可以缺省

操作码:执行何种操作

操作数:执行对象。第一个操作数 :目标操作数;第二个操作数:源操作数

指令格式

  • 零操作数指令:操作码
  • 单操作数指令:操作码操作数操作码[操作数]
  • 双操作数指令:操作码操作数,操作数操作码[操作数],[操作数]

指令中的操作数

  • 立即数:是一个常数
  • 寄存器操作数:是一个地址,计算速度最快
  • 存储器操作数:是一个地址,计算速度最慢

立即数

立即数本身是参加操作的本身,可以是8位或者16位。只能作为源操作数

mov AX,1234H
mov BL,22H

寄存器操作数

参加运算的数存放在指令给出的寄存器中,可以是8位,16位。

mov AX,BX
mov DL,CH

存储器操作数

参与运算的数据存放在存储器的某一个或两个单元中

表现形式:【 】:方括号里面是地址(偏移地址)

MOV AL,[1200H]

指令的寻址方式

立即寻址

由指令直接给出运算数据。操作数为立即数

MOV AX,1200H

结果:AL=00H,AH=12H

常数1200H存放在代码段

寄存器寻址

参加的操作数在CPU的通用寄存器

mov AX,BX

存储器操作数的寻址方式

注意点:

  • 指令的操作对象在内存中。表现形式:【】
  • 方括号中的地址为偏移地址
  • 逻辑段的段基地址通过默认或者重设的方式给出
  • 存储器操作数的字长本身不确定,其字长取决于指令中另一个寄存器的操作数,或者通过其他方式指定字长

直接寻址

方括号里面直接是偏移地址

MOV AX,[1200H]

说明:源操作数为16位,AL=1200H中的数据;AH=12001H中的数据(先低位后高位)

操作数默认为数据段(DS),允许重设

MOV AX,ES: [1200H] :为段重设符

ES:附加数据段

寄存器间接寻址

  • 偏移地址为通用寄存器中的内容,换句话说:偏移地址放在通用寄存器中
  • 仅有4个通用寄存器可以用于存放数据的偏移地址,也叫间址寄存器
  • 间址寄存器:BX(数据寄存器),BP(基址指针寄存器),SI(源变址寄存器),DI(目标变址寄存器)
MOV BX,1200H
MOV AX,[BX]
  • 操作数的段地址(数据差处于哪个段)取决于选哪个间址寄存器。可以重设。
  • BX,SI,DI:默认数据段
  • BP:默认堆栈段

寄存器相对寻址

操作数的偏移地址为寄存器里面内容再加上一个偏移量(任意8bit或者16bit)

MOV AX,[BX+DATA]

MOV AX,2000H
MOV DS,AX
MOV BX,1200H
MOV AL,[BX]5    等价于MOV AL,[BX+5]

相对寻址主要用于一维数组的操作

基址,变址寻址

操作数的偏移地址=基址寄存器中的数据+变址寄存器中的数据

基址寄存器BX,BP;变址寄存器:SI,DI

基址寄存器为BX,默认在数据段

基址寄存器在BP,默认在堆栈段

MOV SI,1100H
mov BX,SI
mov AX ,[SI+BX]      等价于MOV AX,[Bx][SI]

目前偏移地址:1100H+1100H=2200H

基址,变址,相对寻址

操作数的偏移地址=基址寄存器中的数据+变址寄存器中的数据+偏移地址

主要运用二维数组

MOV DI,1100H
MOV BP,DI;
MOV AL,[BP][DI]5

目前偏移地址=1100H+1100H+5H=2205H

隐含寻址

操作数在默认的地址中

MUL BL

指令执行:AL*BL,结果放在AX中

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
计算机系统基础第二次作业 3、对于以下AT&T格式汇编指令,根据操作数的长度确定对应指令助记符中的长度后缀, 并说明每个操作数的方式。 (1)mov 8(%ebp, %ebx, 4), %ax (2)mov %al, 12(%ebp) (3)add ( , %ebx,4), %ebx (4)or (%ebx), %dh (5)push $0xF8 (6)mov $0xFFF0, %eax (7)test %cx, %cx (8)lea 8(%ebx, %esi), %eax 答:如下表所示: "题目编号 "长度后缀 "源操作数 "目的操作数 " "(1) "w "基+比例变+位移 "寄存器 " "(2) "b "寄存器 "基+位移 " "(3) "l "比例变 "寄存器 " "(4) "b "基 "寄存器 " "(5) "l "立即数 "栈 " "(6) "l "立即数 "寄存器 " "(7) "w "寄存器 "寄存器 " "(8) "l "基+变+位移 "寄存器 " 4. 使用汇编器处理以下各行AT&T格式代码时都会产生错误,请说明每一行存在什么错误。 (1)movl 0xFF, (%eax) (2)movb %ax, 12(%ebp) (3)addl %ecx, $0xF0 (4)orw $0xFFFF0, (%ebx) (5)addb $0xF8, (%dl) (6)movl %bx, %eax (7)andl %esi, %esx (8)movw 8(%ebp, , 4), %ax 答: (1)书写错误。因为源操作数是立即数0xFF,所以需要在前面加上'$' (2)由于源操作数(%ax)是16位,而长度后缀是字节'b',所以不一致,应改为'movw ' (3)目的操作数不能是立即数 (4)操作数位数超过16位,而长度后缀为16位的'w',应改为'orl' (5)不能用8位寄存器作为目的操作数地所在寄存器 (6)源操作数寄存器与目的操作数寄存器长度不一致 (7)不存在ESX寄存器 (8)源操作数地中缺少变寄存器 7. 假设变量x和y分别存放在寄存器EAX和ECX中,请给出以下每条指令执行后寄存器EDX中的 结果。 (1)leal (%eax), %edx (2)leal 4(%eax, %ecx), %edx (3)leal (%eax, %ecx, 8), %edx (4)leal 0xC(%ecx, %eax, 2), %edx (5)leal ( , %eax, 4), %edx (6)leal (%eax, %ecx), %edx 答: (1)R[edx]=x //把eax的值放到edx中去 (2)R[edx]=x+y+4 //把eax+ecx+4的值放到edx中去 (3)R[edx]=x+8*y //把eax+8*ecx的值放到edx中去 (4)R[edx]=y+2*x+12 //把ecx+2*eax+12的值放到edx中去 (5)R[edx]=4*x //把4*eax的值放到edx中去 (6)R[edx]=x+y //把eax+ecx的值放到edx中去 8.假设以下地以及寄存器中存放的机器数如下表所示 "地 "机器数 "寄存器 "机器数 " "0x8049300 "0xfffffff0 "EAX "0x8049300 " "0x8049400 "0x80000008 "EBX "0x100 " "0x8049384 "0x80f7ff00 "ECX "0x10 " "0x8049380 "0x908f12a8 "EDX "0x80 " 分别说明执行以下指令或寄存中的内容交发生改变?改变后的内容是什么条件标志OF 、 SF 、 ZF 和 CF 会发生什么改变。 (1)指令功能为:R[edx] R[edx]+M[R[eax]]=0x00000080+M[0x8049300],寄存器EDX中内 容改变。改变后的 内容为以下运算的结果:00000080H+FFFFFFF0H 0000 0000 0000 0000 0000 0000 1000 0000 + 1111 1111 1111 1111 1111 1111 1111 0000 _______________________________________________ 1 0000 0000 0000 0000 0000 0000 0111 0000 因此,EDX中的内容改变为0x00000070。根据表3.5可知,加法指令会影响OF、SF、ZF和 CF标志。OF=0,ZF=0,SF=0,CF=1。 (2)指令功能为:R[ecx] R[ecx]-M[R[eax]+R[ebx]]=0x00000010+M[0x8049400]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值