串操作串操作
源操作数使用si,默认段为DS,可段超越
目的操作数使用di,默认段为ES,不可段超越
串方向
串方向由DF标志位影响,可以由指令修改
重复前缀
串操作指令一般都配合重复前缀使用,实现内存的批量操作。
流程转移指令1.无条件跳转直接转移 jmp
短跳 jmp 或者 jmp short
偏移值范围是 - 128(80H) 到 127(7FH) , 偏移值大小是 一个字节
;栈段stack segment stackstack ends ;数据段data segment g_szBuf db 255 dup(0)data ends ;代码段code segmentSTART: assume ds:data ;指定data段 作为 ds 段 mov ax,data ;先把data的偏移值给ax mov ds,ax ;ax再把data的偏移值给ds ;不直接给是因为没有立即数到段寄存器 mov ax,ax mov ax,ax jmp LEABEL1 ; 跳转到标号 LEABEL1 mov ax,ax mov ax,ax LEABEL1: mov dx,dx mov dx,dx jmp LEABEL2 ; 跳转到标号 LEABEL2 mov dx,dx LEABEL2: mov cx,cx mov cx,cx code ends end START
ip 里面存的是下一条指令的地址. ip被改了,代表下一条指令 也被修改了
jum 既然能跳转,那么指令肯定包含了 要跳转的地址信息 ,那么是如果做到的呢
开始IP 跳转IP 地址偏移值 机器码
0009 000f 6 EB04
0013 0017 4 EB02
从表格中我们不难分析出来 EB 代表 jmp 指令 ,其机器码中并没有直接存储 目标地址的 ip信息 ,也不是直接存储偏移,而是地址偏移值 - 2 , 即 下一条指令 到 目标地址的偏移,那为什么不存储本条指令地址和目的地址的偏移,而要存下一条的呢,因为当一条指令执行完,IP地址就指向了下一条指令的ip地址,如果要储存自己和目标指令的偏移,需要先 - 2 ,把ip地址 改回当前自己的,再去算偏移,所以就直接存储 下条指令的 ip 地址 和目标地址的偏移
上面是考虑的是 从上往下跳,如果从下往上跳呢
stack segment stack ;栈段stack ends data segment ;数据段 g_szBuf db 255 dup(0)data ends code segment ;代码段START: assume ds:data ;指定data段 作为 ds 段 mov ax,data ;先把data的偏移值给ax mov ds,ax ;ax再把data的偏移值给ds ;不直接给是因为没有立即数到段寄存器 mov ax,ax mov ax,ax jmp LEABEL1 ; 跳转到标号 LEABEL1 mov ax,ax mov ax,ax LEABEL1: mov dx,dx mov dx,dx jmp LEABEL1 ; 跳转到标号 LEABEL1 jmp LEABEL2 ; 跳转到标号 LEABEL2 mov dx,dx LEABEL2: mov cx,cx mov cx,cxcode ends end START
开始IP 跳转IP 地址偏移值 机器码
0013 000f -4 EBFA
FA 是 -6 , -4 = -6 +2 ,因此向上跳 也是 记录的 下条指令 到 目标地址的 偏移
近跳 jmp 或者 jmp near
短跳的偏移值 范围 是 - 128(80H) 到 127(7FH) ,如果超过这个范围,那么短跳将无法实现,此时就需要用到近跳
近跳 偏移值范围是 - 32766((8000H)) 到 32765(7FFFH) , 偏移值大小是 一个字
源操作数使用si,默认段为DS,可段超越
目的操作数使用di,默认段为ES,不可段超越
串方向
串方向由DF标志位影响,可以由指令修改
重复前缀
串操作指令一般都配合重复前缀使用,实现内存的批量操作。
流程转移指令1.无条件跳转直接转移 jmp
短跳 jmp 或者 jmp short
偏移值范围是 - 128(80H) 到 127(7FH) , 偏移值大小是 一个字节
;栈段stack segment stackstack ends ;数据段data segment g_szBuf db 255 dup(0)data ends ;代码段code segmentSTART: assume ds:data ;指定data段 作为 ds 段 mov ax,data ;先把data的偏移值给ax mov ds,ax ;ax再把data的偏移值给ds ;不直接给是因为没有立即数到段寄存器 mov ax,ax mov ax,ax jmp LEABEL1 ; 跳转到标号 LEABEL1 mov ax,ax mov ax,ax LEABEL1: mov dx,dx mov dx,dx jmp LEABEL2 ; 跳转到标号 LEABEL2 mov dx,dx LEABEL2: mov cx,cx mov cx,cx code ends end START
ip 里面存的是下一条指令的地址. ip被改了,代表下一条指令 也被修改了
jum 既然能跳转,那么指令肯定包含了 要跳转的地址信息 ,那么是如果做到的呢
开始IP 跳转IP 地址偏移值 机器码
0009 000f 6 EB04
0013 0017 4 EB02
从表格中我们不难分析出来 EB 代表 jmp 指令 ,其机器码中并没有直接存储 目标地址的 ip信息 ,也不是直接存储偏移,而是地址偏移值 - 2 , 即 下一条指令 到 目标地址的偏移,那为什么不存储本条指令地址和目的地址的偏移,而要存下一条的呢,因为当一条指令执行完,IP地址就指向了下一条指令的ip地址,如果要储存自己和目标指令的偏移,需要先 - 2 ,把ip地址 改回当前自己的,再去算偏移,所以就直接存储 下条指令的 ip 地址 和目标地址的偏移
上面是考虑的是 从上往下跳,如果从下往上跳呢
stack segment stack ;栈段stack ends data segment ;数据段 g_szBuf db 255 dup(0)data ends code segment ;代码段START: assume ds:data ;指定data段 作为 ds 段 mov ax,data ;先把data的偏移值给ax mov ds,ax ;ax再把data的偏移值给ds ;不直接给是因为没有立即数到段寄存器 mov ax,ax mov ax,ax jmp LEABEL1 ; 跳转到标号 LEABEL1 mov ax,ax mov ax,ax LEABEL1: mov dx,dx mov dx,dx jmp LEABEL1 ; 跳转到标号 LEABEL1 jmp LEABEL2 ; 跳转到标号 LEABEL2 mov dx,dx LEABEL2: mov cx,cx mov cx,cxcode ends end START
开始IP 跳转IP 地址偏移值 机器码
0013 000f -4 EBFA
FA 是 -6 , -4 = -6 +2 ,因此向上跳 也是 记录的 下条指令 到 目标地址的 偏移
近跳 jmp 或者 jmp near
短跳的偏移值 范围 是 - 128(80H) 到 127(7FH) ,如果超过这个范围,那么短跳将无法实现,此时就需要用到近跳
近跳 偏移值范围是 - 32766((8000H)) 到 32765(7FFFH) , 偏移值大小是 一个字