bx dx 相等之前就进行跳转结束了。。。
中间的 bx dx 我记得 都进行push 和 pop 。。。 所以是会产生相等的情况 。。
只要 call get_top_row 从最上面开始找。
消行之后 draw_new_screen
在画新屏幕的时候
我们会清除 最上面一行。 实际上 。 我们 运行下面代码 会发现。
预期的是 消除 一行 。
但是 消除了 两行。 这里的 clear_row 确实清楚了 最上面一行 。 但是 这个最上面 一行。 本来 应该是 在 check_clear_row 里面 消除的。
; 在 执行 get_top_row 之前
; 3042 为 底部边界 蓝色部分第二个字符
; bx = dx = 3042 - 320 = 2722 倒数第二行 内容
; 执行之后 最上面的一行 就 变为了 bx = 3042-160 = 2882 最后一行内容
; 然后执行 draw_new_line 会 发现 。 本来清楚 最上面一行的代码 。
; 提前将 下一轮循环的 消行 给 消掉了。
; 因为调用的 是一个 clear_row 当只有一行的时候。 即是最后一行也是第一行(最上面一行)
; 第二轮循环的时候 cx = 1
bx = 2882
dx = 2882
会从 最后一行开始检查 ,
但是 那个时候 屏幕上 没有 4432h 了。
所以 执行完 14 次 列 的遍历 检查之后 程序 ret 了。
> 这 就是为什么 程序 可以 正常执行 的原因 。
> 因为根本没有 进入 clear_row 和 draw_new_screen
章节一 28课时. 潜在问题那个.
draw_screen 和 get_top_raw 每次 check_clear_row 的时候都会 重新执行.
在 进入 draw_new_screen 之前 bx , dx 都是一样的.
而 check_clear 里面 的 最后得到的 bx 是 可消行的 那行的 首地址.
也就 是 说 在 上面 没有多余 方块的情况下. 我们两个相减的值 dx 和 bx 是 相等的.
所以 cx 等于 0 执行一次 . 很合理.