我目前正在学习大学的程序集,最近开始编写程序集以点亮32x32 LED模拟器上的LED。为什么逻辑在组件中左移和/或某些值
本周我们有一个实验室,第一个问题是“创建一个程序,点亮随机的单个LED并继续,直到所有的LED点亮”。我有一个朋友告诉我他们是如何做到的,但我仍然对某些选项的工作方式感到困惑。 继承人的代码:
.data
x DWORD 0
y DWORD 0
row DWORD 0
row_copy DWORD 00000001h
.code
main:nop
invoke version
invoke setPattern, 0
row_random:
invoke random, 32 ;create a random number between 0-31
mov x, eax ;move that value into memory location x
invoke readRow, x ;select a row to be altered
mov row, eax
row_on:
invoke random, 32
mov ecx, eax ;move the random value into ecx
shl row_copy, CL ;shift left with carry flag (This is where Im confused)
mov eax, row
mov ebx, row_copy
or eax, ebx ; I'm also unsure as to why this is happening
invoke writeRow, x, eax ;alter a pixel at the random row x with the value of eax
mov row_copy, 00000001h
;invoke Sleep, 1
jmp row_random
invoke ExitProcess,0
最初的时候,我做到了我创建0-31之间的随机数在EBX设置,并使用writeRow x和EBX。然而那是错误的。有人能向我解释为什么你在逻辑上向CL左移?以及为什么它有必要或两个值?我认为或者在那里确保您不会意外地将LED关闭,如果它已经打开了?
感谢您的输入,但我仍然困惑,为什么'shl'和'或'操作正在执行,你能解释一下吗? –
@JamieHyland:更新了答案。单步执行代码并观察寄存器中的值变化应该有助于理解'row | =(1 << rand)'是否不能解释它。 –
@JamieHyland:我想看看循环是多么复杂,所以我重写了函数。您只需要2个保存呼叫的寄存器和两个暂存寄存器,不需要静态存储。 –