• 汇编实验八(王爽)


    assume cs:code
    
    code segment
            mov ax,4c00h          #3
            int 21h               #2
    
    start:  mov ax,0              #3
        s:  nop                   #1
            nop                   #1
    
            mov di,offset s       #3  -> di=0008
            mov si,offset s2      #3  -> si=0020
            mov ax,cs:[si]        #3  ->(ax) = (cs*16+(si))
            mov cs:[di],ax        #3  ->(cs*16+(di)) = (ax)
    
       s0:  jmp short s           #2
       s1:  mov ax,0              #3
            int 21h               #2
            mov ax,0              #3
    
       s2:  jmp short s1          #2
            nop                   #1
    
    code ends
    
    end start

    分析这个程序是否能运行?

    结果是可以运行!我错了,我以为它不可以 ,没跟踪之前分析了半天也没弄出来。

    程序最初执行,执行到mov ax,cs:[si]这里时,ax寄存器内的值等于偏移地址为0020处的汇编机器码(jmp short s1),这个指令代表的是跳到偏移量为(是s1处的偏移地址-jmp指令后第一个指令的地址,算出为-10,补码为F6);执行到mov cs:[di],ax 后,偏移地址为0008处的指令被改为(jmp short s1),而这个指令实际代表的只与偏移量有关,即F6(EBF6);程序继续执行,执行完jmp short s后,跳转到标号s处(偏移地址为0008处)开始执行,此时,该处的指令已经改变为jmp到偏移量为F6(-10)的地方,一计算,发现就是偏移地址为0000处,程序最开始处,即mov ax,4c00h   int 21h,程序正常返回!

    最后的执行结果如下:

  • 相关阅读:
    DHCP Option 60 的理解
    程序中的魔鬼数字
    开源GUI-Microwindows之程序入口分析
    http报错之return error code:401 unauthorized
    内存泄漏以及常见的解决方法
    怎样对ListView的项进行排序
    getline函数
    JavaFx初探
    ListBox控件的操作与实现
    SQLite的SQL语法
  • 原文地址:https://www.cnblogs.com/jane315/p/12893518.html
Copyright © 2020-2023  润新知