关于王爽老师实验实验八 (分析一个奇怪的程序)之个人解析

 我是一个初学者,满打满算也就自学了一个月汇编。废话不说了,转入正题:

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


这个程序用debug进行跟踪调试,会发现是可以正常结束的。

下面是我的跟踪调试的情况,当程序运行到

      mov di,offset s
      mov si,offset s2
      mov ax,cs:[si]
      mov cs:[di],ax
之后是会发现

地址                   机器码     汇编代码

1440:0008      90         s:nop
1440:0009      90           nop

变为

 地址                               机器代码       汇编代码

1440:0008                       EBF6                jmp 0000(debug中的表现形式)

当程序跳转到上面这一步时,会发现它是向0000的ip跳转的,究其原因是F6是补码,转换之后是0AH(即向后跳转0AH个地址),执行这条指令时,cpu通过寻址把EBF6放入指令缓冲器中,然后ip加2变为000AH,之后ip减去相对偏移地址0AH,那么计算过之后ip就指向了0000H,之后cs:ip就指向了1440:0000的位置,即程序将执行执行

  mov ax,4c00h
	 int 21h
这样程序就正常结束了。


个人感觉这个程序是考察大家对”jmp指令执行时,cpu并不知道转移的目的地址“这句话的理解;也就是考察大家对转移指令原理的理解。

如果我有什么说得不好,请大家订正。

本文章免费,允许随意更改和转载,不必标明出处。



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值