学汇编,记笔记(实验笔记)《汇编语言》王爽著——实验8_分析一个奇怪的程序

169 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

前言

学习教材:《汇编语言(第4版)》王爽著 此笔记是书中内容+自我总结,方便查阅和复习 请支持原著

@[toc]

实验前别忘了复习之前的笔记

分析下面的程序,在运行前思考:这个程序可以正确返回吗?

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

assume 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

分析

assume cs:codesg
codesg segment
        mov ax,4c00h
        int 21h
start:  mov ax,0 ;入口
    s:  nop ;机器码复制到这里,即jmp short s1的 机器码
        nop

        mov di,offset s
        mov si,offset s2
        mov ax,cs:[si]
        mov cs:[di],ax ;将s2处复制到s处

    s0: jmp short s ;返回运行s
    
;==========只用看上半段==========
    s1: mov ax,0
        int 21h
        mov ax,0

    s2: jmp short s1
        nop
codesg ends
end start

答案

程序是可以正常运行的程序运行到s0处,跳转到s处运行复制的s1机器码。段间转移的本质是基于偏移量,而不是标号的当前地址

这里s2的机器码jmp short s1存储的偏移量刚好与s处到返回值的偏移量一致,因此s处跳转到第一行mov ax,4c00h,接着正常退出程序了

Debug运行一下,复制后S(ds:8)的机器码是EBF6

在这里插入图片描述 跳转到S处运行,S处继续跳转到第一行,也就是程序出口 在这里插入图片描述 程序可以正常运行

这里恰好位移量相同可以正常运行,强调的是jmp的机器码存储的是计算好的位移量而不是当前标号的地址,切记