王爽《汇编语言》(第三版)实验8解析(超详细)

题目

分析程序,在运行前思考:这个程序是否能够正确返回?

运行之后再思考:为什么是这种结果?

通过这个程序加深对相关内容的理解。

贴入代码如下:

assueme cs:codesg
codesg segment
        mov ax,4c00h
        int 21h
start:  mov ax,0
    s:  nop
        nop

        mov di,offset s
        mov si,offset s2
        mov ax,cs:[si]
        mov cs:[di],ax

    s0: jmp short s

    s1: mov ax,0
        int 21h
        mov ax,0

    s2: jmp short s1
        nop
codesg ends
end start

分析

由我们之前学到的知识,我们知道这个程序从start标号的字段开始执行。

我们先来看一下程序的执行流程:

 1. start: mov ax,0
 2.   s:  nop  ; nop标号语句,在运行时在代码段中分配一个字节的空间,
 3.       nop  ; 这个字节(空间)的值为90h。

        ; 操作符 `offset` 的功能是取得标号的偏移地址。
 4.       mov di,offset s   ; 将 s 的偏移地址存到 di 寄存器中
 5.       mov si,offset s2  ; 将 s2 的偏移地址存到 si 寄存器中
 6.       mov ax,cs:[si]   ; 此行是将cs:[si]内存中的机器码存到ax寄存器中,
                           ; 这个机器码是由编译器将 s2 标号字段中的指令编译而成。
 7.       mov cs:[di],ax  ; 将 ax 中的 s2 标号字段的机器码存放到 s 标号字段中。

 8.   s0: jmp short s  ; 跳转到 s 标号字段处执行代码。

 9.   s:  jmp short s1 ; 根据我们之前的分析, 指令是用相对偏移来表示的
    ; 因此执行的操作并不是真的跳转到 s1 这个标号,
    ; 而是跳转编译时确定的 该指令到 s1 标号的偏移量。
    ; 所以我们要分析接下来程序的流程的话 , 就必须先编译程序 ,
    ; 通过查看这条指令的机器代码,才知道偏移量是多少。
    ; 然后再根据这个偏移量确定程序下一步应该执行哪里的指令。
    ; 根据下图的编译结果 , 可以发现 ,
    ; jmp short s1 在编译后得到的指令是 : EB F6
    ; 由上可知,偏移量是 :F6
    ; 偏移量是由 补码 来表示的,由书中 附注二 ,
    ; 我们可以算出 F6对应的有符号十进制数为 -10。
    ; 从这里,我们可以知道,这条指令是将 ip 的值加上 -10。
    ; 那么,我们再看看 ip - 10 指向的地址是哪里呢 ?
    ; 由下图的编译结果,我们可以知道,
    ; 它指向的刚好就是 code segment 开始的位置.

 10.   mov ax,4c00h
 11.   int 21h      ;看到这两句,大家就知道,程序是可以正常返回了

反编译

注意这里使用 debug 的 u 命令进行反汇编的时候要指定代码段的偏移地址为 0 ,否则 debug 会自动从 start 标号的地方开始反汇编

有时候单纯从 u 0 命令无法查看到jmp short s1这条代码。因为有的命令行工具可能不能够显示过多的代码。 我们可以从上图中找一个参照点,再次运用 u 命令,就可以看到这行代码了。从下图中,我们可以看到,jmp short s1对应的机器代码,正是 EB F6

  • jmp short s1的跳转原理分析:
1. codesg segment
        mov ax,4c00h     ; 3字节
        int 21h          ; 2字节
2. start:  mov ax,0         ; 3字节
3.    s:  jmp short s1     ; 2字节
    ; 上述4条指令总共加起来是10字节,即 10 个单位的偏移量!
    ; 由于 nop 只占一个字节 , 因此
    ; 原来 s 中的两个 nop 被jmp short s1完全替代。
    ; CPU首先读取这条指令到指令缓存器里
    ; 此时的ip为8(由上图可以知道)
    ; 【文末的参考文章中的len(EB F6)解释错误,应为2,此处已更正】
    ; 接下来 , (ip) = (ip) + len(EB F6) = (ip) + 2 = 10
    ; 然后执行这条指令 , 即为 (ip) = (ip) - 10 = 0
    ; 这样 ip 就回到了 code segment 的起始处
    ; 这样继续执行
4. mov ax,4c00h
5. int 21h
    ; 这样,程序就这样神奇的执行成功啦!!!

总结

运用王爽老师在P179页的话,CPU在执行jmp指令的时候并不需要转移的目的地址,而包含的是转移的位移。这个位移,是编译器根据汇编指令中的“标号”计算出来的。

本博参考了他的文章:

链接:https://www.jianshu.com/p/7e5dfea72b65

原文地址:https://www.cnblogs.com/nojacky/p/9497660.html

时间: 2024-10-07 14:41:21

王爽《汇编语言》(第三版)实验8解析(超详细)的相关文章

王爽汇编语言第三版第5章实验4

第(3)小题 下面的程序的功能是将“mov ax,4c00h”之前的指令复制到内存0:200处,补全程序.上机调试,跟踪运行结果. assume cs:code code segment mov ax,     cs       ;cs为程序入口的段地址,我们就是要从这里开始复制 mov ds,ax mov ax,0020h mov es,ax mov bx,0 mov cx,     cx        ;程序刚加载完成时,cx存放的是程序的大小,这里我不确定答案,我试过后看到mov ax,4

王爽汇编第三版实验10

1. 显示字符串 1 assume cs:code 2 3 data segment 4 db 'Welcome to masm!',0 5 data ends 6 7 stack segment 8 db 16 dup (0) 9 stack ends 10 11 code segment 12 start: 13 mov dh,8 14 mov dl,3 15 mov cl,2 16 mov ax,data 17 mov ds,ax 18 mov si,0 19 call show_str

【汇编语言】(王爽著第三版)实验二

实验二 实验任务(一) 实验前要求我们将书本P74的程序段按理论分析,将结果进行填空.之后用Debug,将该程序段写入内存,逐条执行之后, 根据指令执行后的实际运行的结果填空如下. mov ax,0021 mov  ax , ffff mov  ds , ax mov  ax , 2200 mov  ss , ax mov  sp , 0100 mov  ax , [0]                       ;ax=3130 add  ax , [2]                 

王爽汇编第三版检测点10.5

(1)下面的程序执行后,ax 中的数值是多少? 1 assume cs:code 2 stack segment 3 dw 8 dup (0) 4 stack ends 5 code segment 6 start: mov ax,stack 7 mov ss,ax 8 mov sp,16 9 mov ds,ax 10 mov ax,0 11 call word ptr ds:[0] 12 inc ax 13 inc ax 14 inc ax 15 mov ax,4c00h 16 int 21h

最强大的王爽汇编语言学习环境使用教程

最强大的王爽汇编语言学习环境使用教程 一.前言 这是采用VMwere Workstation 12 pro虚拟机软件,搭建的MS-DOS学习环境,在windowsXP/8/10及linux中均可以使用,在这个环境中,我集成了CCDOS中文系统,pdos中文系统,使用这些系统,可以进行中文输入与显示.还集成了,十分著名的汇编语言调试工具TR,它比debug更加强大.并且集成了适合王爽汇编语言学习的微软汇编语言编译器masm5和dos中最强大的文本编辑器 vim73 for DOS,这是一个支持彩色

王爽汇编语言(第三版)环境搭建(附PDF及工具下载)

一.前言 最近在学习汇编语言,使用的是读者评价非常高的王爽老师写的<汇编语言>(第三版),为了适应现在各个版本的windows操作系统,所以采用VMWare虚拟机来搭建纯DOS环境. 二.需要的工具 VMware-workstation-12.DOS系统镜像文件.汇编编译器masm和连接器link 百度云下载链接:https://pan.baidu.com/s/1gfz4N67 密码:02y1 三.安装VMware-workstation-12 傻瓜式安装,一直点击下一步就可以(虽然网上也可以

汇编语言(王爽 第三版)实验十六

与原实验稍有不同,实现的功能为按下1键清屏 按下2键设置前景色为蓝色 按下3键设置背景色为白色 按下4键向上滚动一行 assume cs:code stack segment db 128 dup (0) stack ends code segment start: mov ax,stack mov ss,ax mov sp,128 mov ax,cs mov ds,ax mov ax,0 mov es,ax mov di,204h mov si,offset int9 mov cx,offse

汇编语言(王爽 第三版)实验十五

assume cs:code stack segment db 128 dup (0) stack ends code segment start: mov ax,stack mov ss,ax mov sp,128 push cs pop ds mov ax,0 mov es,ax mov si,offset int9 mov di,204h mov cx,offset int9end-offset int9 cld rep movsb push es:[9*4] pop es:[200h]

汇编语言(王爽 第三版)实验十二

assume cs:code code segment start: mov ax,cs mov ds,ax mov si,offset do0 mov ax,0 mov es,ax mov di,200h mov cx,offset do0end-offset do0 cld rep movsb mov ax,0 mov es,ax mov word ptr es:[0*4],200h mov word ptr es:[0*4+2],0 mov ax,4c00h int 21h do0: jm