- 1、本文档共35页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
10 第三章 Intel处理器指令系统和汇编语言_1
OFFSET 操作符
PTR 操作符
TYPE 操作符
LENGTHOF 操作符
SIZEOF 操作符;返回数据标号的偏移地址(标号距数据段开始的距离,以字节为单位)。
保护模式下偏移总是32位的。
实模式下偏移只有16位。;例:假设bVal位处。
.data
bVal BYTE ?
wVal WORD ?
dVal1 DWORD ?
dVal2 DWORD ?
.code
……
mov esi,OFFSET bVal ; ESI =
mov esi,OFFSET wVal ; ESI =
mov esi,OFFSET dVal1 ; ESI =
mov esi,OFFSET dVal2 ; ESI =
mov esi,OFFSET bVal + 1
……;用来说明操作数的尺寸/类型
必须和以下标准数据类型联合使用:BYTE,SBYTE,WORD,SWORD,DWORD,SDWORD,FWORD,QWORD,TBYTE;(三)和数据相关的操作符和伪指令 2. PTR操作符;返回按字节计算的变量的单个元素的大小。
例:
.data
var1 BYTE ?
var2 WORD ?
var3 DWORD ?
var4 QWORD ?;计算数组中元素的个数。
例:;SIZEOF返回值=LENGTHOF返回值×TYPE返回值
例:;用寄存器作为地址,通过改变寄存器的值来访问内存单元
可以是任何用方括号括起来的32位通用寄存器(EAX,EBX,ECX,EDX,ESI,EDI,EBP、ESP)
.data
val1 BYTE 10h
.code
mov esi,OFFSET val1
mov AL,[esi]
mov [esi],BL
实地址模式下只能用SI,DI,BX,BP。通常尽量避免使用BP(BP常用来寻址堆栈而不是数据段)。;(四)间接寻址 1. 间接操作数(寄存器间接寻址);汇编语言中如何寻址数组元素?
完全使用直接寻址 —— 不切实际
解决办法:用寄存器作为指针,通过改变指针寄存器的值来访问数组中的不同元素,存放地址的寄存器称为间接操作数。;例:三个双字相加
.data
arrayD DWORD 10000h,20000h,30000h
.code
mov esi,OFFSET arrayD
mov eax,[esi]
add esi,4
add eax,[esi]
add esi,4
add eax,[esi];例:
.data
arrayB BYTE 10h,20h,30h
.code
mov esi,0
mov al,[arrayB + esi] ; ?
mov al,arrayB[esi] ; ?
mov esi,OFFSET arrayB
mov al,[esi] ; ?
mov al,[esi+1] ; ?
mov al,[esi+2] ; ?
Array 定义为 word?
;控制转移或分支是一种改变程序执行顺序的方法。
控制转移可分为两种:
无条件转移:以JMP指令为例
条件转移:以LOOP指令为例;例:创建一个循环
top:
.
.
.
jmp top ; 死循环;格式:LOOP 目的地址/标号
执行过程:
在实地址模式下,用做默认循环计数器的是CX而不是ECX。
在任何模式下,LOOPD指令都使用ECX作为循环计数器;LOOPW都使用CX作为循环计数器。;例:
mov ax,0
mov ecx,5
L1: inc ax
loop L1
循环结束时,AX=? ECX=?;循环的目的地址与当前地址只能在相距-128到+127字节的范围之内。机器指令平均3字节左右,因此一个循环平均最多只能包含大约42条指令。
循环的嵌套;数组元素的求和 (SumArray.asm)
; This program sums an array of words.
INCLUDE Irvine32.inc
.data
intarray WORD 100h,200h,300h,400h
.code
main PROC
mov edi,OFFSET intarray ; address of intarray
mov ecx,LENGTHOF intarray ; loop counter
mov ax,0 ; zero the accumulator
L1:
add ax,[edi] ; add an integer
add edi,TYPE intarray ; point to next integer
loop L1 ; repeat unti
文档评论(0)