loop 指令的功能是重复执行一段相同的代码,处理器在执行它的时候会顺序做两件事:
和 jmp near start 一样,loop digit 后跟的操作数也是一个相对的偏移量,是在编译阶段,编译器用标号 digit 所在位置的汇编地址减去 loop 指令的汇编地址,再减去 loop 指令的长度( 2 )来得到的。
;计算各个数位
mov bx,ax
mov cx,5 ;设置循环次数
mov si,10 ;除数
digit:
xor dx,dx
div si
mov [bx],dl ;保存数位
inc bx
loop digit
上面 loop 指令的操作数0xF7
,编译阶段是这么算出来的。0x43 - 0x4A - 0x2 = -9
,而-9 截取一个字节的话,就是 F7.
现在的问题是 cpu 是如何使用 loop 指令的操作数的?我是这么猜的:
0x4A + F7 + 2 = 0x143
0x0000_004A
的低 8bit 替换为算出来的0x43
,得到 要跳转的地址0x0000_0043
不知道对不对?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.