《汇编语言》王爽(第四版)第九章 实验8

文章目录

前言

一、题目

二、分析

1.初始时指令存储情况

2.运行时指令存储情况

总结


前言

本文是学习王爽老师《汇编语言》(第四版)第九章 实验8 分析一个奇怪的程序  时的相关代码及分析。


一、题目

分析程序,思考程序是否可以正确返回;运行后再思考,为何是这种结果。

assume cs:code

code 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

code ends
end start

二、分析

1.初始时指令存储情况

在debug中运行前,使用U命令查看指令以及对应的十六进制数据,结果如下。

 下面以表格的形式进行整理。

初始时指令在内存中的存储情况
标号IP(偏移地址)数据形式指令形式备注
0000B8004Cmov ax,4c00H
0003CD21int 21H
start0005B80000mov ax,0000
s000890nop
000990nop
000ABF0800mov di,0008
000DBE2000mov si,0020
00102Ecs:
00118B04mov ax,[si]
00132Ecs:
00148905mov [di],ax
s00016EBF0jmp 0008跳转程序,位移为F0H(反码)
s10018B80000mov ax,0000
001BCD21int 21H
001DB80000mov ax,0000
s20020EBF6jmp 0018跳转程序,位移为F6H(反码)
002290nop

下面分析这些指令。

0016H处的指令,是jmp跳转指令。 当前jmp指令的偏移地址是0016H,下一条指令的偏移地址是0018H,而要跳转到的标号s的偏移地址是0008H。“jmp short 标号”指令中存储的应当是地址的位移,而不是目标地址。因而位移是 0008H - 0018H = -0010H = -16(十进制)。

由于计算机使用反码表示数字,于是就将-0010H转为反码。根据反码规则,10H的二进制为0001 0000 B,取反加一得 1111 0000 B,即F0H,这就是-0010H的反码。因而内存中的数据为“EBF0”,其中“EB表示跳转”,“F0”就是要跳转的16进制位移量。

同理,0020处的指令,位移量应当是 0018H - 0022H = -000AH ,用反码表示为 F6 H。因此此处的数据为“EBF6”,即跳转程序且位移量为F6H(反码)。

2.运行时指令存储情况

下面以表格形式逐条分析指令。

关键点在于,要理解0020H处的指令,并不是“跳转到0018H处”,而是“跳转程序,位移量为F6H”。

运行时指令执行顺序
标号IP(偏移地址)数据形式指令形式备注
start0005B80000mov ax,0000ax=0
s000890nop

这两个字节之后会被改写为EBF6H,

即跳转程序,转移位移为F6H

(-000AH的反码)

000990nop
000ABF0800mov di,0008di=8H
000DBE2000mov si,0020si=20H
00102Ecs:
00118B04mov ax,[si]ax=cs:[20H]=EBF6H
00132Ecs:
00148905mov [di],axcs:[8H]=EBF6H
s00016EBF0jmp 0008

当前IP=0018H,指令为

跳转程序,位移为F0H(-10H的反码),

即跳转至08H处执行

s0008EBF6jmp 

当前IP=10H,指令为跳转程序,位移为

F6H(-000AH的反码),即跳转至

00H处执行

0000B8004Cmov ax,4c00H程序返回
0003CD21int 21H

因此,最终程序能够正确返回。


总结

本文分析了 王爽老师《汇编语言》(第四版)第九章 实验8 的程序原理,加深了对于jmp指令的参数为“位移量”而不是“目标地址”的理解。

  • 9
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值