加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

汇编语言(王爽第三版)实验8分析一个奇怪的程序

(2017-04-18 08:45:45)
标签:

汇编

王爽

it

教育

分类: 汇编语言(王爽第三版)实验

实验八 分析一个奇怪的程序

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

运行后思考:为什么是这样的结果?

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

代码如下:

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

程序分析:

1. 看懂程序从何处入口?有start标号的地方(当然是和end start匹配的)

2. s:标号语句nop作用,在运行时在代码段分配一个字节的空间。(机器码90,在内存中就是90H),它的作用是方便在程序运行时代码段分配空间,在此写入代码(实际是机器码)。执行二次nop后,在cs段中分配了2个字节空间,内容都是90H

3.     mov di, offset s        ;s标号处的偏移地址赋值给didi指向了s

        mov si, offset s2       ;s2标号处的偏移地址赋值给sisi指向了s2

        mov ax, cs:[si]         ;将cssi指向的内存单元的内容赋值给ax(内容为机器码)

        mov cs:[di], ax         ;将机器码赋值给s标号处

       这四条语句的作用是将s2处的机器码赋值给s标号开始的2个连续空间中。

程序一直自顶向下执行着,直到遇到S0标号。

       s0: jmp short s 程序运行到此处。表示跳转到s标号处,此处有代码是EBF6,执行它,向前偏移10个字节,正好是codesg segment

mov ax0 ==3byte int 21H==2byte mov ax 4c00H==3byte)也就是程序从mov ax 4c00H开始执行了,直到int 21H正常结束程序。

       总结:

       1. jmp XXXX,我们在汇编语言中,你不必去考虑位移的问题,那是编译器的事情,要不我们累死啦。它自动计算位移(偏移量)。

       2. 如果涉及到了jmp指令的机器码问题。我们必须考虑位移的问题。

       3. jmp指令的位移的计算方式,在机器码中,位移是按照补码方式存储的;也就是说向下移动EB代码后面是正整数(正数,补码是原码);如果是向上移动EB代码后面是负整数(原码取反+1)。EB代码后边跟随的数值,是jmp的偏移位移,这个位移是按照字节作为移动单位的。

       4. 我们发现,标号s1及以后的汇编代码,程序就没有执行。为什么?使用jmp跳转到前边了。虽然没有执行,但是在编译过程中,它们的机器码也被编译并存储在了代码段了。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有