串操作指令要配合下面的重复前缀使用
** 源操作数使用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标志位影响, 可以由指令修改
STD给DF标志位置1;
CLD给DF标志位置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: