1 / 7
文档名称:

简明x86汇编语言教程(5).pdf

格式:pdf   页数:7
下载后只包含 1 个 PDF 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

简明x86汇编语言教程(5).pdf

上传人:精品下载 2012/3/11 文件大小:0 KB

下载得到文件列表

简明x86汇编语言教程(5).pdf

文档介绍

文档介绍:简明x86汇编语言教程(5)
疯狂代码/ ĵ:http://assembler/
串操作我们前面已经提到内存可以和寄存器交换数据也可以被赋予立即数问题是如果我们需要把
内存某部分内容复制到另个地址又如何做呢?

设想将DS:SI处连续512字节内容复制到ES:DI(先不考虑可能重叠)也许会有人写出这样代码:


NextByte: mov cx,512
mov al,ds:[si]
mov es:[di],al
inc si
inc di
loop NextByte ; 循环次数

我不喜欢上面代码它确能达到作用但是效率不好如果你是在做优化那么写出这样代码意味着赔了夫人又折


IntelCPU强项是串操作所谓串操作就是由CPU去完成某数量、重复内存操作需要介绍说明是我们常用
KMP算法(用于匹配串中模式)改进——Boyer算法由于没有利用串操作因此在IntelCPU上效率并非最优好编译
器往往可以利用Intel CPU这特性优化代码然而并非所有时候它都能产生最好代码

某些指令可以加上REP前缀(repeat, 反复的意)这些指令通常被叫做串操作指令

举例来说STOSD指令将EAX内容保存到ES:DI同时在DI上加或减 4类似STOSB和STOSW分别作1字节或1字
上述操作在DI上加或减数是1或2

计算机语言通常是不允许 2义性为什么我要说“加或减”呢?没错孤立地看STOS?指令并不能知道到底是
加还是减这取决于“方向”标志(DF, Direction Flag)如果DF被复位则加;反的则减

置位、复位指令分别是STD和CLD

当然REP只是几种可用前缀的常用还包括REPNE这个前缀通常被用来比较两个串或搜索某个特定(字、双字
)REPZ、REPE、REPNZ也是非常常用指令前缀分别代表ZF(Zero Flag)在区别状态时重复执行

下面说 3个可以复制数据指令:
助记符意义
movsb 将DS:SI字节复制到ES:DI的后SI、DI
movsw 将DS:SI字节复制到ES:DI的后SI2、DI2
movsd 将DS:SI字节复制到ES:DI的后SI4、DI4

于是上面改写为

cld
mov cx, 128
rep movsd ; 复位DF
; 512/4 = 128共128个双字
; 行动!

第句cld很多时候是多余实际写时很少会出现置DF情况不过在正式决定删掉它的前建议你仔细地调试自己并
确认每个能够走到这里路径中都不会将DF置位

(非预期)DF是危险它很可能断送掉你这直接造成缓冲区溢出问题

什么是缓冲区溢出呢?缓冲区溢出分为两类类是写入缓冲区以外内容类是读取缓冲区以外内容后种往往更
隐蔽但随便哪个都有可能断送掉你

缓冲区溢出对于个网络服务来说很可能更加危险怀有恶意用户能够利用它执行自己希望指令服务通常拥有
更高特权而这很可能会造成特权提升;即使不能提升攻击者拥有特权他也可以利用这种问题使服务崩溃从而形
成次成功DoS(拒绝服务)攻击每年CERT安全公告中