Je suis en train d'apprendre l'assemblage au collège et j'ai récemment commencé à écrire des programmes d'assemblage pour allumer des LED sur un simulateur LED 32x32.Pourquoi le décalage logique est-il parti et/ou certaines valeurs dans l'assemblage
Nous avions un laboratoire cette semaine et la première question était "créer un programme qui allume une LED individuelle aléatoire et continue jusqu'à ce que toutes les LED soient allumées". Un de mes amis m'a montré comment ils l'ont fait, mais je ne comprends toujours pas comment fonctionnent certaines options. Heres le code:
.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
À l'origine, quand je l'ai fait je créais un nombre aléatoire entre 0-31 mise en EBX et en utilisant writerow avec x et EBX. Cependant, c'était faux. Quelqu'un pourrait-il m'expliquer pourquoi vous passez logiquement à gauche avec le CL? et pourquoi est-ce nécessaire à ou les deux valeurs? Je pense que le ou est là pour vous assurer que vous n'avez pas accidentellement éteindre une LED si elle était déjà allumée?
Merci pour votre contribution, mais je suis encore confus quant à savoir pourquoi 'shl' et les opérations' or' sont en cours d'exécution, pourriez-vous expliquer? –
@JamieHyland: Mise à jour de la réponse. Une simple progression dans le code et l'observation des valeurs dans les changements de registres devraient vous aider à comprendre si 'row | = (1 << rand)' ne l'explique pas. –
@JamieHyland: Je voulais voir à quel point la boucle était trop compliquée, donc j'ai réécrit la fonction. Vous avez seulement besoin de 2 registres d'appel préservés et de deux registres de travail, pas de stockage statique. –