Je suis coincé à cette chose, je veux voir si le bouton de déplacement vers la droite a été pressé, j'ai donc ce code assambler:8086 assembleur, INT 16,2
mov ah,2
int 16h ;calling INT 16,2 - Read Keyboard Flags interrupt
mov ah,10000000b
shl al,7
and al,10000000b
cmp al,ah ;check if first bit is 1
je rshift
jmp final
rshift:
mov ah,9
lea dx,rsh ;rsh is a string that says that "right shift button has been pressed"
int 21h
jmp final
final: ; quit program
mov ax,4c00h
int 21h
pourquoi est-il ne fonctionne pas, Je pense que le problème est que int 16,2 ne fonctionne pas correctement, si oui, pourquoi est-ce? ici est ce que INT est censé 16,2 faire:
AH = 02
on return:
AL = BIOS keyboard flags (located in BIOS Data Area 40:17)
|7|6|5|4|3|2|1|0| AL or BIOS Data Area 40:17
| | | | | | | `---- right shift key depressed
| | | | | | `----- left shift key depressed
| | | | | `------ CTRL key depressed
| | | | `------- ALT key depressed
| | | `-------- scroll-lock is active
| | `--------- num-lock is active
| `---------- caps-lock is active
`----------- insert is active
Je ne vois jamais le message, je l'ai regardé le registre AL dans le débogage et il ne semble pas changer après que j'appelle INT 16, 2.I'm en cours d'exécution Win 7 sur un x86 arhitecture, et je travaille avec tasm
Comment est-ce censé fonctionner? Dois-je appuyer sur Maj avant d'exécuter le programme, je l'ai testé et affiche toujours le résultat zéro.Je cours Win 7 x86, et je l'ai testé avec tasm –
Oui, vous devez appuyer sur shift (s) à l'avance car il n'y a pas de retard dans le code (bien qu'il ne soit pas difficile d'ajouter un délai, ou d'envelopper ce code dans une boucle). Sous Windows, vous pouvez également faire ceci: 'ping -n 5 localhost && test.exe' (en supposant que test.exe est le programme ci-dessus), et disposez de 5 secondes pour appuyer (et maintenir) les touches désirées. – atzz
J'ai commencé à penser à des boucles ... Exécutez ce qui suit dans la ligne de commande de Windows, et vous serez en mesure de voir le résultat changer "interactivement" :) 'pour/L% I in (1,1,10000) fais (ping -n 2 localhost> nul & test.exe) ' (désolé, je n'ai pas Windows près de moi pour le moment, donc la ligne ci-dessus n'est pas testée) – atzz