- 1、本文档共8页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
汇编-第3课精选
汇编-第3 课
2012 年11 月14 日星期三
16:08
VC内存断点
内存断点,如图1
图1
原理:将相关内存页属性设置为PAGE_NOACCESS,这样当此页内存被读写的时候,调试器就会
捕获到这个异常,然后调试器就挂起被调试的进程,再把内存页属性恢复回去,这样程序就能
够正常执行。
段寄存器
cs:代码段,指明代码段的起始地址.
ss:堆栈段,指明堆栈段的起始地址.sp:堆栈指针寄存器,指向栈顶. bp:基址指针寄存器,指向栈
底.
ds:数据段,放全局变量,静态变量,某些常量。DOS 汇编没有read,write,share...这些权限之分,
环境不支持.
es:附加段附加的数据段也用于保存数据串操作中默认目的操作数的存放区域供用户自定, , , .
义使用.
windows 操作系统 没有划分段,4 段合一了.
有sp指向栈顶,为什么还需要bp指向栈底呢?
因为函数嵌套调用,堆栈段中可能有多个栈,每个函数都有自己的栈,此时sp 和bp 指向当前
栈栈顶和栈底.
汇编中过程相当于C语言中的函数
每次调用过程先保存栈底bp,然后修改sp.过程执行完以后,先修改sp,然后恢复bp.
处理器处理指令的一般流程
1.取指令 2.译码 【3】.访问数据 4.处理数据 【5】.写回数据 步骤3.5 是可选的
每次取指令默认 cs:ip 来取得下一条要执行的指令
段超越前缀
没有指明情况下,数据访问DS 段,使用bp 访问主存,在ss 段. 使用CS:或者SS:或者DS:或者
ES:就可以段超越了.
段超越为什么说是前缀因为在 下面 等是一条单独的指令该指令写在想要超越的
: debug cs: ,
指令的前面,而写成mov ax,cs:[1000]是不正确的.
如图2.
图2
debug 下默认是段重叠的,com 可执行文件的数据,代码是放置在一起的,不超过64k.
寻址方式(寻找操作数的过程)
汇编语言 类比 C 语言
mov ax,9 i = 9
mov ax,cx i= j
mov ax,[1000] i = *p
指令格式
对比上图
前缀:这里可以理解成段超越前缀,其余类型的前缀暂时不考虑,1 个字节,最多4 个前缀.
操作码:可能为1,2,3 字节,视具体情况而定.Mod r/m 是有可能附加的3-bit 的操作码域.
偏移量:可能为1,2,4 字节,也有可能没有
立即数:总在偏移量后面,可能为1,2,4 字节,也有可能没有.
许多涉及内存操作数的指令都有一个紧挨着主操作码的寻址格式说明字节(叫做ModR/M字
节),ModR/M字节包含3个域信息:
mod域与r/m域组成32个可能的值:8个寄存器和24个寻址模式.
reg/opcode域确定寄存器号或者附加的3位操作码.reg/opcode域的用途由主操作码确定.
r/m域确定一个寄存器为操作数或者和mod域一起编码寻址模式.有时候有些指令使用特定的mod
域和r/m域组合来表示操作码信息.
立即数寻址:
MOV AX B8
MOV CX B9
MOV DX BA
MOV BX BB
MOV SP BC
MOV BP BD
MOV SI BE
MOV DI BF
ADD AX 05
ADD CX 81C1
ADD DX 81C2
ADD BX 81C3
ADD SP 81C4
ADD BP 81C5
ADD SI 81C6
ADD DI 81C7
SUB AX 2D
SUB CX 81E9
SUB DX 81EA
SUB BX 81EB
SUB SP 81EC
SUB BP 81ED
SUB SI 81EE
SUB DI
文档评论(0)