n° 219
Novembre 2017
Dicembre 12, 2017, 04:43:00 *
Benvenuto! Accedi o registrati.
Hai dimenticato l'e-mail di attivazione?

Accesso con nome utente, password e durata della sessione
Notizia:
 
   Indice   Linux Windows Techassistance Gameassistance videogame hardware Aiuto Ricerca Agenda Downloads Accedi Registrati  


* Messaggi recenti
Messaggi recenti
Pagine: [1] 2   Vai giù
  Stampa  
Autore Discussione: [ASM x86] - Tasti direzionali e menu  (Letto 7582 volte)
0 utenti e 1 Utente non registrato stanno visualizzando questa discussione.
rich94
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 8


Mostra profilo E-mail
« inserita:: Agosto 13, 2014, 06:12:25 »

Buongiorno a tutti,
ho un piccolo problema che non riesco a risolvere, allora, sto facendo un programma in assembly, che stampa a video su terminale(linux) un menù "interattivo" così strutturato:

1. Setting automobile:
2. Data: 13/8/2014
3. Ora: 17:40:35                                               
4. Blocco automatico porte: ON                                                         
5. Back-home: ON                                                                           
6. Check olio
7. Frecce direzione
8. Reset pressione gomme

il programma deve stampare all'avvio (-> ./nome_eseguibile)

 solo la prima riga, poi con la combinazione di tasti (freccia giù + invio) deve permettermi
di spostarmi di riga in riga visualizzando sempre una riga alla volta, poi nelle righe 4 e 5

dovrei accedere ai rispettivi sottomenù con i tasti(freccia destra + invio)
per accedere e (freccia su/freccia giù + invio) + INVIO per selezionare la riga e tornare al menù principale

esempio1

4. Blocco automatico porte: ON 
-(premo freccia dx + invio)
 
Set blocco porte: ON
Set blocco porte: OFF

anche qui si deve visualizzare una riga alla volta, quindi sarebbe così

Set blocco porte: ON
(premo freccia giù + invio)

Set blocco porte: OFF
(premo nuovamente invio)


4. Blocco automatico porte: OFF

spero si capisca

ho implementato anche il programma per l'aggiornamento dell'ora ad ogni avvio del programma
ora posto quello che sono riuscito a fare

PS: (metto i codici del main, della data/ora perchè gli altri sono simili)



#questo è il main(main.s)
Codice:
.section .text
.section .data

_start:
call main
xorl %eax, %eax
inc %eax
xorl %ebx, %ebx
int $0x80
call date
xorl %eax, %eax
inc %eax
xorl %ebx, %ebx
int $0x80

call time
xorl %eax, %eax
inc %eax
xorl %ebx, %ebx
int $0x80
call porte
xorl %eax, %eax
inc %eax
xorl %ebx, %ebx
int $0x80
call home
xorl %eax, %eax
inc %eax
xorl %ebx, %ebx
int $0x80
call olio
xorl %eax, %eax
inc %eax
xorl %ebx, %ebx
int $0x80
call frecce
xorl %eax, %eax
inc %eax
xorl %ebx, %ebx
int $0x80
call reset
xorl %eax, %eax
inc %eax
xorl %ebx, %ebx
int $0x80

#questo è il codice della data(date.s)
Codice:
.section .data
.LC0:
.string "2. Data: %d/%d/%d\n"
.text
.globl date
.type date, @function
date:
.LFB0:
.cfi_startproc
pushl %ebp
.cfi_def_cfa_offset 8
.cfi_offset 5, -8
movl %esp, %ebp
.cfi_def_cfa_register 5
pushl %ebx
andl $-16, %esp
subl $32, %esp
leal 24(%esp), %eax
movl %eax, (%esp)
.cfi_offset 3, -12
call time
leal 24(%esp), %eax
movl %eax, (%esp)
call localtime
movl %eax, 28(%esp)
movl 28(%esp), %eax
movl 20(%eax), %eax
leal 1900(%eax), %ebx
movl 28(%esp), %eax
movl 16(%eax), %eax
leal 1(%eax), %ecx
movl 28(%esp), %eax
movl 12(%eax), %edx
movl $.LC0, %eax
movl %ebx, 12(%esp)
movl %ecx, 8(%esp)
movl %edx, 4(%esp)
movl %eax, (%esp)
call printf
movl $0, %eax
movl -4(%ebp), %ebx
leave
.cfi_restore 5
.cfi_def_cfa 4, 4
.cfi_restore 3

.cfi_endproc

questo è il codice dell'ora(time.s)

Codice:
.section   .rodata
.LC0:
   .string   "3. Ora: %d:%d:%d\n"
   .text
   .globl   tim
   .type   tim, @function
tim:
.LFB0:
   .cfi_startproc
   pushl   %ebp
   .cfi_def_cfa_offset 8
   .cfi_offset 5, -8
   movl   %esp, %ebp
   .cfi_def_cfa_register 5
   pushl   %ebx
   andl   $-16, %esp
   subl   $32, %esp
   leal   24(%esp), %eax
   movl   %eax, (%esp)
   .cfi_offset 3, -12
   call   time
   leal   24(%esp), %eax
   movl   %eax, (%esp)
   call   localtime
   movl   %eax, 28(%esp)
   movl   28(%esp), %eax
   movl   (%eax), %ebx
   movl   28(%esp), %eax
   movl   4(%eax), %ecx
   movl   28(%esp), %eax
   movl   8(%eax), %edx
   movl   $.LC0, %eax
   movl   %ebx, 12(%esp)
   movl   %ecx, 8(%esp)
   movl   %edx, 4(%esp)
   movl   %eax, (%esp)
   call   printf
   movl   $0, %eax
   movl   -4(%ebp), %ebx
   leave
  .cfi_restore 5
   .cfi_def_cfa 4, 4
   .cfi_restore 3
   
   .cfi_endproc


non so dove sbattere la testa, ho cercato negli appunti e in alcuni pdf, non riesco ad implementare i tasti
(e gestire la grafica, tipo visualizzare una riga alla volta) ma non è rilevante.

qui ho trovato un sito con i codici dei tasti, ma i tasti direzionali non hanno codice ascii che potrebbe essere utilizzato Triste

ecco il link
http://www.tutorialpc.it/lingc17.asp

scusate la lunghezza del post, spero possiate aiutarmi
grazie e buona giornata
Registrato
michele.p
Administrator
Full Member
*****

Karma: +9/-2
Scollegato Scollegato

Messaggi: 586


Mostra profilo
« Risposta #1 inserita:: Agosto 13, 2014, 07:08:24 »

Potresti, come primo passo, provare ad intercettare dalla shell bash la pressione dei tasti freccia per vedere cosa ti restituiscono e di conseguenza gestirli via assembly...  Occhi al cielo
Registrato
rich94
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 8


Mostra profilo E-mail
« Risposta #2 inserita:: Agosto 13, 2014, 07:14:30 »

Potresti, come primo passo, provare ad intercettare dalla shell bash la pressione dei tasti freccia per vedere cosa ti restituiscono e di conseguenza gestirli via assembly...  Occhi al cielo

Innanzitutto grazie della risposta, ora non vorrei sembrare ignorante(  Che?!? Lo sono) ma come si fa?
Cioé ci avevo pensato anche io ma non riesco a trovare come si fa a leggere il segnale(codice) che rilascia la pressione di un pulsante ma in particolare dove lo trovo il codice su quale registro Pianto

Ok, ho trovato un sito con dei comandi

showkey in particolare

http://www.fis.uniroma3.it/CALCOLO_DOC/unix/appuntilinux/al32.htm


Solo che mi da un errore dell tipo
non é possibile lanciare il comando perché maca un file nel terminale

Grazie dell'attenzione
Registrato
michele.p
Administrator
Full Member
*****

Karma: +9/-2
Scollegato Scollegato

Messaggi: 586


Mostra profilo
« Risposta #3 inserita:: Agosto 13, 2014, 10:07:07 »

Dovresti avere nella distribuzione in uso (qual è?) il comando:

Codice:
showkey

le opzioni che potrebbero ritornarti utili potrebbero essere la -s la -k e/o la -a (man showkey per le spiegazioni).

Fai sapere...  Linguaccia

Bye 8-)
Registrato
rich94
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 8


Mostra profilo E-mail
« Risposta #4 inserita:: Agosto 13, 2014, 11:25:59 »

Dovresti avere nella distribuzione in uso (qual è?) il comando:

Codice:
showkey

le opzioni che potrebbero ritornarti utili potrebbero essere la -s la -k e/o la -a (man showkey per le spiegazioni).

Fai sapere...  Linguaccia

Bye 8-)

Si, infatti ho provato con -a che serve per i caratteri, -s per gli scancodes e -k per keykodes, ma mi dice di inserire dei parametri

Tipo

showkey [-a | --ascii]
Lo stessk per gli altri ma quando lancio il comando mi dice che l'ultima parte (--ascii, --scancodes ecc) non esiste come comando

Se intende la distribuzione di linux(mint maya 32 bit cinammon)

Registrato
michele.p
Administrator
Full Member
*****

Karma: +9/-2
Scollegato Scollegato

Messaggi: 586


Mostra profilo
« Risposta #5 inserita:: Agosto 13, 2014, 11:28:39 »

Dai il comando, da utente root:

Codice:
showkey -a

premi Invio, poi premi i tasti freccia (o qualunque altro tasto). Non ti restituisce alcun codice?!  Che?!?

Bye 8-)
Registrato
rich94
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 8


Mostra profilo E-mail
« Risposta #6 inserita:: Agosto 14, 2014, 09:48:18 »

Dai il comando, da utente root:

Codice:
showkey -a

premi Invio, poi premi i tasti freccia (o qualunque altro tasto). Non ti restituisce alcun codice?!  Che?!?

Bye 8-)
Buongiorno, ho provato stamattina il comando che mi aveva detto
da terminale (ignoro ancora cosa sia utente root  Linguaccia)
sembrerebbe funzionare ecco i risultati

^M            13 0015 0x0d (tasto invio)


^[[A      27 0033 0x1b
             91 0133 0x5b (tasto freccia su)
             65 0101 0x41

^[[B     27 0033 0x1b
             91 0133 0x5b (tasto freccia giù)
             66 0102 0x42

^[[C     27 0033 0x1b
             91 0133 0x5b (tasto freccia destra)
             67 0103 0x43

^[[D     27 0033 0x1b
             91 0133 0x5b(tasto freccia sinistra)
             68 0104 0x44

non riesco a capire però perchè i due codici iniziali
27 0033 0x1b
91 0133 0x5b
di ogni freccia sono uguali

Adesso resta da capire come usare i codici in assembly  Che?!?
buona giornata
Registrato
michele.p
Administrator
Full Member
*****

Karma: +9/-2
Scollegato Scollegato

Messaggi: 586


Mostra profilo
« Risposta #7 inserita:: Agosto 14, 2014, 11:21:07 »

Prova ad attivare il Num Lock (con il tasto Bloc Num) e guarda la differenza.  Occhiolino


Bye 8-)

P.S.: root è (di default) l'utente l'amministratore della tua distribuzione GNU/Linux. Ho detto di impartire come root (quindi da utente amministratore) quel comando perché nel mio caso (distribuzione Slackware) non mi viene dato "il permesso" da utente normale.
Registrato
rich94
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 8


Mostra profilo E-mail
« Risposta #8 inserita:: Agosto 14, 2014, 11:52:04 »

Prova ad attivare il Num Lock (con il tasto Bloc Num) e guarda la differenza.  Occhiolino


Bye 8-)

P.S.: root è (di default) l'utente l'amministratore della tua distribuzione GNU/Linux. Ho detto di impartire come root (quindi da utente amministratore) quel comando perché nel mio caso (distribuzione Slackware) non mi viene dato "il permesso" da utente normale.

ho provato, con (Fn + Block Num(F11))
ma non cambia niente

ps: non sono proprio sicuro di aver capito, il discorso del root, cioè io ho un notebook dove ho installato linux mint, l'utente root o amministratore sarei io?
Registrato
michele.p
Administrator
Full Member
*****

Karma: +9/-2
Scollegato Scollegato

Messaggi: 586


Mostra profilo
« Risposta #9 inserita:: Agosto 14, 2014, 03:19:44 »

Ti riporto quello che accade nel mio caso facendo accendere il led Num Lk associato al tastierino numerico.
Con il led spento per il tasto "Freccia Su / 8" risulta:

Citazione
^[[A      27 0033 0x1b
              91 0133 0x5b
              65 0101 0x41

Lo stesso tasto ma con il led acceso (quindi abilitando il tastierino per le operazioni aritmetiche):

Citazione
8      56 0070 0x38

L'utente "root" nelle distribuzioni GNU/Linux è l'utente amministratore, quell'utente "che può tutto" Ghigno ...ma in alcune distribuzioni viene disabilitato (mi sembra che Mint è una di queste).
L'utente normale ha un "ambiente più limitato" e infatti avrai notato che per un certo numero e tipo di comandi sei "costretto" ad utilizzare il comando:

Citazione
sudo

altrimenti non ti è permessa una data operazione con quel particolare comando.
Registrato
rich94
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 8


Mostra profilo E-mail
« Risposta #10 inserita:: Agosto 14, 2014, 05:05:07 »

Grazie, aspetta vediamo se ho capito, abilitando il blocco num, i tasti direzionali che devo utilizzare sono quelli sul tastierino numerico giusto?

Ammettiamoo che sia cosí, quindi il codice che dovrei implementare(anche se ancora non so come usarlo nel programma  Indeciso)é quello che mi ha postato lei;

Solo un problema, quando lancio il menù io devo spostarmi proprio con il tasto freccia su/giù ecc,
non é che poi il codice che inserisco sia sbagliato?

Un'altra cosa, facendo come ha detto lei
Premendo una volta 8 la prima cosa che esce é la stessa di quando il led é spento, poi torna

il codice singolo 8 ...
Registrato
michele.p
Administrator
Full Member
*****

Karma: +9/-2
Scollegato Scollegato

Messaggi: 586


Mostra profilo
« Risposta #11 inserita:: Agosto 14, 2014, 07:37:14 »

Fai una prova: ad esempio prova ad intercettare in Assembly un tasto qualuqnue in base al codice che ti viene restituito. Ad esempio prova ad intercettare il tasto Q (quindi il suo codice) e vedi come devi "assemblare"  Linguaccia il tutto. Se riesci ad intercettarlo passi al codice del tastierino numerico.

Il motivo dei due codici differenti è indotto dal fatto che se è attivo il Num Lock i tasti hanno una funzione, altrimenti ne hanno un'altra.

Fai sapere...

Bye  Fico
Registrato
rich94
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 8


Mostra profilo E-mail
« Risposta #12 inserita:: Agosto 15, 2014, 08:00:23 »

Si, ma io intendevo dire che sia che abbia attivo il block num, che non, premendo i tasti freccia del tastierino nunerico, comunque mi stampa un volta


Con tastierino nunerico abilitato



^[[A      27 0033 0x1b     (Freccia su/8)
              91 0133 0x5b
              65 0101 0x41

8      56 0070 0x38        (Freccia su/8)

^[[A      27 0033 0x1b     (Freccia su/8)
              91 0133 0x5b
              65 0101 0x41

Nn so il motivo, il codice relativo al tasto lo devo estrapolare con una sys_read? Peró cosí legge solo i caratteri
Registrato
michele.p
Administrator
Full Member
*****

Karma: +9/-2
Scollegato Scollegato

Messaggi: 586


Mostra profilo
« Risposta #13 inserita:: Agosto 17, 2014, 12:00:23 »

STrano, devo provare sul portatile...

Intanto prova ad intercettare un tasto qualunque, ad esempio il "Q" e vedi se riesci a gestire con più tasti, ad esempio il tipico controllo in un videogioco "sparatutto" con i tasti di direzione: "W", "A", "D", e "X" (o "S").
Registrato
rich94
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 8


Mostra profilo E-mail
« Risposta #14 inserita:: Agosto 17, 2014, 08:44:48 »

Ok grazie, ti dico cosa ho pensato io,
Allora righe semplice seplice

In teoria quando viene premuto un tasto associato a un carattere, sono interessati i registri al e ah, il primo contiene il codice del carattere(tasto), il secondo va a zero.


Allora io all'inizio caricherei in una variabile tipo

Lettera:
            movl $XX, lettera

.section .text




cmp lettera, %al
je etichetta


etichetta:
call funzione


Come le.sembra? É sbagliato?

Grazie
Registrato
Pagine: [1] 2   Vai su
  Stampa  
 
Vai a:  

Copyright © 2017 Edizioni Master SpA. p.iva : 02105820787

Tutti i diritti di proprietà letteraria e artistica riservati. - Privacy



powered by Simple Machines