汇编语言实验8分析一个奇怪的程序
汇编语言实验8分析一个奇怪的程序
0x00 任务一
不运行分析:
这个题目考察的知识在于 jmp short s1里的具体实现,我们从start开始逐条分析语句,直到mov cs:di,ax 我们就明白了 s标号处的nop已经被s2处的 jmp short s1(对应机器码应该是两个字节)替换了,那么 s处被替换后的jmp short s1还能够实现跳转到s1的功能吗?不行! 因为short 和 near ptr都是保存跳转的相对位移,所以该语句实际功能是ip向前移动(减小)若干字节,大小是从 s2下面的nop语句对应的地址s1标号对应的地址,我没有运行不知道具体大小
调试分析:
被装入内存是汇编指令分析jmp short s1 是由0022h->0018h 那实际上是减小0ah 对应机器码是0ebf6h 为什么是f6呢? 00h-ffh 这256个数用来表示-128到127 所以 1000 0000b以上 为负数 所以 f6是-10对应 减小0ah
此时对应的机器指令和汇编指令:
果然虽然s处的指令被改为jmp short s1 但是最终跳转到00h而不是s1的18h 原因在于是相对移动-0ah 在执行08h处的 0ebf6(往前移动0ah)之前,ip已经先指向了了下一条指令0ah 所以最终 0ah-0ah=00h 最终跳到了00h处
本实验的目的主要是考察 jmp的原理 记住jmp short 标号和 jmp near ptr 标号 保存相对地址 而 jmp far ptr 标号是保存的物理地址 (注意 near 和 far 后面带ptr 因为 地址信息超过1字节了)
而寄存器和内存的jmp 都是绝对地址