shuiyu 发表于 2017-8-15 18:49:26

《零基础入门学习汇编语言》第四十六讲(含实验八)


越努力,越幸运。欢迎大家来看我的笔记{:10_297:} 小白刚学,不对的请各位大佬指正,谢谢{:10_254:}

一、根据位移进行转移的意义
(1)前面我们讲到:
   jmp short 标号      (对IP的修改范围为 -128~127)
   jmp near ptr 标号    (对IP的修改范围都为-32769~32767)
   jcxz 标号            (对IP的修改范围都为-128~127)
   loop 标号
等几种汇编指令,它们对 IP的修改是根据转移目的地址和转移起始地址之间的位移来进行的。在它们对应的机器码中不包含转移的目的地址,而包含的是到目的地址的位移距离。这样设计,方便了程序段在内存中的浮动装配。

(2)如果loop s的机器码中包含的是s的地址,则就对程序段在内存中的偏移地址有了严格的限制;因为机器码中包含的是 s 的地址,如果 s 处的指令不在目的地址处,程序的执行就会出错。而loop s的机器码中包含的是转移的位移,就不存在这个问题了;因为,无论 s处的指令的实际地址是多少,loop指令的转移位移是不变的。

(3)通俗的讲就是类似于C语言中的自定义函数,可以重复调用,方便快捷

(4)注意,根据位移进行转移的指令,它们的转移范围受到转移位移的限制,如果在源程序中出现了转移范围超界的问题,在编译的时候,编译器将报错。


实验八:


运行程序前分析:根据题目可以分析得出程序最终跳转到s1处,执行s1处的命令,但是缺少了mov ax,4c00h这个结束命令;所以按照我的理解应该是不能正确返回的。




运行后:用debug单步执行发现,这个程序正确返回了{:10_250:}而且它最终没有跳到s1处,而是在执行s0: jmp short s命令后,跳到了s0处;理论上在跳到s处后,应该执行 s2:jmp short s1命令(因为前面的命令已经把s:NOP 处的命令改成了s2处的命令了)。但是它却执行了jmp 0000这个命令。另我百思不得其解{:5_105:}
但是我发现了一个问题,那就是执行mov ax,cs:   mov cs:,ax时,cs:接收到的机器码是F6EB。而其实sc:处的机器码为EBF6。具体集体是不是这个问题还是得看小甲鱼下一讲的详细解答{:5_109:}








谢谢小甲鱼带来的视频教程,感谢!! {:10_303:}

本节结束,多谢览阅!
越努力,越幸运。谢谢大家来看我的笔记{:10_297:} 小白刚学,不对的请各位大佬指教,谢谢{:10_254:}
页: [1]
查看完整版本: 《零基础入门学习汇编语言》第四十六讲(含实验八)