16位汇编 06

2022/3/3 22:16:06

本文主要是介绍16位汇编 06,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

 

>> 串操作

>> 串操作指令

 

串操作指令要配合下面的重复前缀使用

 

** 源操作数使用SI, 默认段为DS, 可段超越

目的操作数使用DI, 默认段为ES, 不可段超越

 

>> 内存拷贝

1:movsb: 一次拷贝一个字节 ,si和di自加1或者自减1

 

 

 

2: movsw: 一次拷贝两个字节,si和di自加2或者自减2

 

 

 

还有一种拷贝指令:movs

用法: movs byte ptr [di], byte ptr cs:[si]

movs wprd ptr [di], word ptr cs:[si]

 

 

上面的指令为内存拷贝到内存指令

 

 

>>内存赋值(初始化内存)

3: stosb

4: stosw

3,4指令为将al,或者ax内容,存储到di所指向的内存(给内存赋值)

 

>> 内存取值

5: loasb

6: loasw

5,6指令为将SI所指向的内存内容,读到al或者ax中 (从内存取值)

 

 

>> 内存块比较

7: cmpsb

8: cmpsw

si指向的内存与di指向的内存比较, si内容- di内容, 不存储结果, 影响结果标志位(ZF)

 

>> 内存值比较(查找值)

9: scasb

10:scasw

 

al或者ax减去di所指向的内存内容, 不存结果, 影响标志位

al/ax - di

 

 

>>总结

 

 

>> 串方向

 

串方向由DF标志位影响, 可以由指令修改

 

STDDF标志位置1;

CLDDF标志位置0;

 

 

 

>> 重复前缀

 

串操作指令一般配合重复前缀使用, 实现内存的批量操作。

上面表中左后一行中regnz错了, 应该是repnz

 

先在cx里指明要拷贝的内存大小, 每次拷贝一个字节, cx值减1, 直到cx值为0,

内存拷贝完毕

 

示例:

 

>> 流程转移

 

核心为改IP值

 

>> 无条件跳转

>> 直接跳转

 

短跳近跳都是段内跳转,远眺可以跨段跳转

短跳最多可以跳FF = 255个字节

近跳最多可以跳FFFF= 65535个字节

 

短跳和近跳一般中间不用加上修饰符, 编译器会自定识别

 

远跳有两种写法:

 

 

 

>> 计算跳转指令(重点)

 

 

jmp指令中, 如果机器码中有偏移, 该偏移是下一条指令跳转目的地址偏移

该偏移可以是正数,也可以是负数

因为解析指令时, 取指令已经完成, IP已经变为下一条指令。

 

 

 

当我们知道了, 跳转的起始地址和目的地地址时,计算跳转指令, 算法是:

 

目的地址 - (起始地址+2/3/5) = EBXX / E9XXXX / EAXXXXXXXX

 

>> 间接跳转

** 使用寄存器间接跳转

1: 格式jmp reg

2: reg为通用寄存器 (2个字节, 只能用于近处跳)

3:功能 ip <-reg

4: 只能用于段内转移

 

 

 

 

 

 

>> 条件跳转

 

图1:

 

 

 

图2:

图3:

图4:

 

 



这篇关于16位汇编 06的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程