shuiyu 发表于 2017-8-24 22:00:05

《零基础入门学习汇编语言》第四十七讲(实验八实验九详解)

本帖最后由 shuiyu 于 2017-8-27 15:31 编辑

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

实验八

(1)在上一讲中,我对实验八有两个疑问:
第一个疑问:s2处的机器码为什么变成了F6EB。而不是EBF6。
第二个疑问:为什么执行了一个 jmp 0000的指令。

(2)首先第一个疑问:这个问题其实是我大惊小怪了,就是高低地址存放问题{:10_266:} ,F6EB拿出来的话就是EBF6(因为高地址排在低地址后面{:10_258:} )

(3)第二个疑问:因为 jmp short s 是跳转一个位移的,并不是跳转到一个地址。执行到s0处时跳转到s处,而s处在前面已经赋值成jmp short s机器码为F6EB;EB就是jmp的意思,F6是跳转的位移(是一个补码等于-10),也就是往上跳10个单元。所以就显而易见了,在s处执行jmp short s往上跳10个单元刚好到 mov ax,4c00h{:10_279:}

实验九
终于把实验九弄明白了,还是挺高兴的


(1)话不多说上图,这个是按小甲鱼写的(三个LOOP)



为什么是add ax,0ah呢?解:这个0ah其实就是加a0h的意思,因为字母不能直接在首位,所以加一个0在前面;而a后面的那个0为什么省略掉了呢?因还记得XXXX:XXXX的表达方式要乘以16往左移一位吗?平常我们都是使前面的段地址左移一位,而现在的ax实际是B8720H,写成了B872H,故只能把偏移地址左移一位了~即a0H。

(2)这个是直接连字节属性一起循环赋值了的(两个LOOP)



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

本节结束,多谢览阅!
越努力,越幸运。谢谢大家来看我的笔记{:10_297:} 小白刚学,不对的请各位大佬指教,谢谢{:10_254:}

灰灰灰 发表于 2017-10-17 12:27:49

实验八s2转移到s1,为什么是ebf6啊,f6是-10,也就是上移十个字节,可是s2与s1之间的位置相差也没有十个字节啊
1

灰灰灰 发表于 2017-10-17 12:32:03

灰灰灰 发表于 2017-10-17 12:27
实验八s2转移到s1,为什么是ebf6啊,f6是-10,也就是上移十个字节,可是s2与s1之间的位置相差也没有十个字 ...

这是s2与s1之间的字节,只有cd21b80000五个字节啊

shuiyu 发表于 2017-10-17 16:10:33

本帖最后由 shuiyu 于 2017-10-17 16:11 编辑

灰灰灰 发表于 2017-10-17 12:32
这是s2与s1之间的字节,只有cd21b80000五个字节啊

感谢老铁的提问,看了你的问题以后我也思考了挺久(距离发帖时间间隔一个多月了{:10_250:})。对于占多少个字节这个问题?我的理解呢就是要把 mov ax,0 和 jmp short s1占有的字节也算上的,因为执行完jmp指令后IP是指向下一条指令了(也就是jmp指令的末尾),所以要把jmp short s1指令占有的字节算上;而对于mov指令,因为你要跳转到标号s1处,所以肯定是要把IP指向mov指令的前面,故mov指令也要算上{:10_297:}。个人理解个人理解,但是我觉得我的这个理解应该没有错{:10_250:}

灰灰灰 发表于 2017-10-18 12:14:14

shuiyu 发表于 2017-10-17 16:10
感谢老铁的提问,看了你的问题以后我也思考了挺久(距离发帖时间间隔一个多月了)。对于占多 ...

我觉得不对,首先,我也注意到你说的了,到时我关注过小甲鱼的视频,确实不能算上mov和jmp'指令。其次,偏移值的计算是,目标ip值-此刻的ip值,也就是18-22=5(18.19.20.21.22),所以还是5个字节啊。

shuiyu 发表于 2017-10-18 13:02:41

本帖最后由 shuiyu 于 2017-10-18 13:04 编辑

灰灰灰 发表于 2017-10-18 12:14
我觉得不对,首先,我也注意到你说的了,到时我关注过小甲鱼的视频,确实不能算上mov和jmp'指令。其次, ...

首先,老哥你算错了22-18=10(这是16进制的,并不是十进制。18,19,1A,1B,1C,1D,1E,1F,20,21)。其次,你使用22-18在这里就已经把mov和jmp指令算进去了,如果不算进去的话应该是1B-20。老哥你对内存的理解不够啊

灰灰灰 发表于 2017-10-18 15:50:37

shuiyu 发表于 2017-10-18 13:02
首先,老哥你算错了22-18=10(这是16进制的,并不是十进制。18,19,1A,1B,1C,1D,1E,1F,20,21)。其次, ...

嗯嗯,懂了,我理解的还是不够深。。。谢谢了~

徒手拆高达 发表于 2019-8-20 15:35:27

实验九没有必要将BX 压栈出栈,根本没有覆写BX。
页: [1]
查看完整版本: 《零基础入门学习汇编语言》第四十七讲(实验八实验九详解)