广海社区吧 关注:704贴子:1,863
  • 3回复贴,共1

8086汇编(16位汇编)学习笔记06.串操作、流程转移指令

只看楼主收藏回复

串操作串操作
源操作数使用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) , 偏移值大小是 一个字


IP属地:湖南1楼2024-12-21 23:29回复
    https://bpsend.net/thread-99-1-1.html
    原文链接


    IP属地:湖南2楼2024-12-21 23:51
    回复


      IP属地:湖南来自iPhone客户端3楼2024-12-23 14:04
      回复


        IP属地:湖南来自iPhone客户端4楼2024-12-25 09:17
        回复