View Full Version : CREAZIONE DI UN MENù in assembly per intel 80x86 AT&T
Salve a tutti,
ho un problema che non riesco a risolvere, perdonatemi, ma proprio non so da dove partire, devo scrivere un programma in assembly (at&t) su linux, che quando viene lanciato da linea di comando, visualizzi un menù del tipo:
1. riga 1
2. riga 2
3. .....
lanciando l'eseguibile si deve visualizzare una riga alla volta, per spostarsi da una riga all'altra si devono premere i tasti (freccia giù + invio).
una delle righe deve visualizzare l'ora/data, (le specifiche non puntualizzano se devono essere o meno quelle del sistema, ma non riesco a trovare a come fare per prendere la data/ora dal sistema)
so che chiedo molto, e sto cercando in tutti i modi di capirci qualcosa ma mi blocco in continuazione, grazie per l'attenzione e l'aiuto
buonaserata
vuoi sapere come dedurre la data in asm o come creare un menu con una applicazione eseguita da terminale ? Non si capisce cosa tu voglia chiedere con questa domanda.
Buongiorno, allora scusi se la domanda era poco chiara, comunque per quanto riguarda l'ora io vorrei sapere come fare (con quali istruzioni particolari)scrivere un programma in assembly (per intel 80x86, set istruzioni at&t) che mi stampi su una delle righe del menú l'ora e la data del sistema.
Esempio
Menu:
1. Data: 03/08/14
2. Ora: 7:50
3. .....
Ecco e poi non capisco come fare per spostarsi da un riga all'altra (freccia giú + invio)
visualizzando peró una sola riga alla volta.
Grazie dell'attenzione
cdimauro
03-08-2014, 07:14
Intanto posta il codice che hai già realizzato. POI si può parlare dei problemi che hai avuto.
buongiorno, innanzitutto scusate il ritardo ma ho avuto molto da fare, comunque quello che sono riuscito a ottenere dopo aver lanciato il programma da terminale è questo:
Menù cruscotto
1. Setting automobile:
2. Data: 15/06/2014
3. Ora: 15:32
4. Blocco automatico porte: ON
5. Back-home: ON
6. Check olio
7. Frecce direzione
8. Reset pressione gomme
invece quello che si deve vedere è questo:
Menù cruscotto
1. Setting automobile:
//poi premendo freccia giù + invio deve spostarsi di rigas in riga
Menù cruscotto
2. Data: 15/06/2014 visualizzandone però sempre una alla volta,
ecco io ho sviluppato il programma in 1 main e 8 funzioni (sottoprogrammi) per facilitarmi nel caso avessi riscontrato dei problemi
ecco il main
.section .data
menu:
.ascii " Menù cruscotto\n"
menu_len:
.long . -menu # lunghezza della stringa in byte
.section .text
.global _start
_start:
movl $4, %eax # 4 corrisponde alla system call "write"
movl $1, %ebx # stampa nello standard output (schermo)
leal menu, %ecx # puntatore char a ciò che si vuole stampare
movl menu_len, %edx # copia del contenuto della variabile. carica la lunghezza della variabile
int $0x80 # system call (int sarebbe "interaction"); con 0x80 si lancia una interaction generale
# dichiarata (in base ai valori caricati precedentemente nei registri)
call setting
jmp exit
call data
jmp exit
call ora
jmp exit
call porte
jmp exit
call home
jmp exit
call olio
jmp exit
call frecce
jmp exit
call reset
exit:
xorl %eax, %eax
inc %eax
xorl %ebx, %ebx
int $0x80
---------------------------------------
//sottoprogramma per le righe, ne posto solo uno perchè gli altri sono uguali a parte le etichette e sull'ultimo quello per la riga reset alla fine ho messo l'istruzione ret per uscire dal programma
.section .data
set:
.ascii "1. Setting automobile:\n"
set_len:
.long . -set # lunghezza della stringa in byte
.section .text
.global setting
.type setting, @function
setting:
movl $4, %eax # 4 corrisponde alla system call "write"
movl $1, %ebx # stampa nello standard output (schermo)
leal set, %ecx # puntatore char a ciò che si vuole stampare
movl set_len, %edx # copia del contenuto della variabile. carica la lunghezza della variabile
int $0x80 # system call (int sarebbe "interaction"); con 0x80 si lancia una interaction generale
# dichiarata (in base ai valori caricati precedentemente nei registri)
il problema dell'aggiornamento dell'ora e della data è facoltativo era solo una mia curiosità
vi chiedo scusa ancora per il tempo dedicatomi e spero si legga. Buona giornata
cdimauro
08-08-2014, 07:17
Allora, intanto "int" non sarebbe "interaction", ma interruzione.
Poi ti consiglio di mettere il codice dentro il tag CODE (è uguale al QUOTE, ma cambia solo il nome del tag).
Il codice del main che hai postato sembra sia parziale, perché non si capisce come fai a stampare tutte le voci del menu.
Comunque per recuperare data e ora devi conoscere la syscall da chiamare. Non sono esperto di Linux, ma dovresti trovarne qualcuna che fa al caso tuo se spulci nell'elenco da dove hai preso quella per la write.
grazie per la risposta, (scusa ma quando ho scritto i commenti ero sul cell e non ho viato l'errore :-), comunque il main che ho scritto a parte stampare le la scritta Menú cruscotto, poi senplicemente richiama (call .....) le.funzioni che si trovani sugli altri file, tipo quello che ho messo dopo il main, quello che non capisco é come.fare a viaualizzare una riga alla volta quindi impostare come pulsanti (frecciá giú + invio) per passare da una riga all'altra, sugli appunti che ho non viene fatto riferimento, scusa la mia ignoranza .
Poi ho un file con le system call, ma non riesco a capie come usare, fa solo riferimento a un programma scritto in c,
Grazie per il tempo dedicatomi
grazie per la risposta, (scusa ma quando ho scritto i commenti ero sul cell e non ho viato l'errore :-), comunque il main che ho scritto a parte stampare le la scritta Menú cruscotto, poi senplicemente richiama (call .....) le.funzioni che si trovani sugli altri file, tipo quello che ho messo dopo il main, quello che non capisco é come.fare a viaualizzare una riga alla volta quindi impostare come pulsanti (frecciá giú + invio) per passare da una riga all'altra, sugli appunti che ho non viene fatto riferimento, scusa la mia ignoranza .
Poi ho un file con le system call, ma non riesco a capie come usare, fa solo riferimento a un programma scritto in c,
Grazie per il tempo dedicatomi
cdimauro
08-08-2014, 18:25
Sulle API Linux non sono ferrato. Dovresti fare una ricerca e recuperare quelle che ti servono.
Per fare ciò che chiedi devi definire prima cosa intendi per "visualizzare una riga alla volta", e come gestire le frecce. Insomma, cosa deve fare il programma all'avvio, e cosa quando si preme la freccia sù e la freccia giù. Intendo in maniera precisa: descrivi per bene cosa ti aspetti ogni volta. Poi sarà una questione di recuperare le giuste API che ti servono.
Allora cercerò di spiegarlo molto semplicemente:
all'avvio del programma, sul terminale dovrà apparire solamente una riga(la prima)
come segue
1. Setting automobile:
-il programma deve permettermi a questo punto premendo (freccia giù + invio) di passare alla riga successiva.. esempio (premo freccia giù + invio)
2. Data: 15/06/2014 (premo freccia giù + invio)
3. Ora: 15:32 (eccetera)
sulla riga 4 e 5
4. Blocco automatico porte: ON
5. Back-home: ON
dovrei implementare anche dei sottomenù che mi permettano (premendo freccia destra + invio di accedervi)
visualizzando questo
4. Blocco automatico porte: ON (premo freccia dx + INVIO) ---> ON/OFF
5. Back-home: ON (premo freccia dx + INVIO) ---ON/OFF
praticamente, una volta entrati nel sottomenù si deve poter impostare la riga relativa esempio (riga 4) sempre con i tasti freccia SU + INVIO (per l'ON) e freccia GIÙ + INVIO per l'OFF
ecco questo è quello che dovrei fare, ma i sottomenù se capisco forse ci arrivo dopo
grazie ancora per l'attenzione
Salve, forse ho trovato qualcosaper ik discorso della gestione dei pulsanti, non ho ben capito dato che ero su cellulare, ma in teoria vengono messi in lista i tasti e credo il tipo di segnale o interrupt che corrisponde alla pressione di un determinato tasto, forse si potrebbe usarli combinando quelli che servono per fare l'azione o le azioni che mi aspetto dal programma.
Questo é il link, spero si possa mettere :)
http://www.ctyme.com/intr/rb-0045.htm
cdimauro
10-08-2014, 11:11
Non credo che quel link ti sia utile. Devi cercare fra le syscall che Linux ti mette a disposizione per gestire l'input. Il vettore da richiamare dovrebbe essere lo stesso di quello usato per visualizzare stringhe.
Riguardo all'applicazione, il mio consiglio è di strutturare il codice in modo da gestire un elenco di voci di menù. Quindi niente codice tipo call che hai mostrato prima.
Per essere più chiari, le stringhe con le voci dei menù dovrebbero essere conservate in un vettore, e devi tenere traccia della voce attualmente visualizzata. Quindi all'inizio "punti" alla prima voce del menù, e la visualizzi. Quando premi il tasto di freccia sù o giù devi controllare le condizioni di contorno / limite, e regolarti di conseguenza. Quando si preme invio devi richiamare la routine associata a quella particolare voce, e anche qui ti suggerisco di utilizzare un vettore.
%eax Name Source %ebx %ecx %edx %esx %edi
1 sys_exit kernel/exit.c int - - - -
2 sys_fork arch/i386/kernel/process.c struct pt_regs - - - -
3 sys_read fs/read_write.c unsigned int char * size_t - -
4 sys_write fs/read_write.c unsigned int const char * size_t - -
5 sys_open fs/open.c const char * int int - -
6 sys_close fs/open.c unsigned int - - - -
7 sys_waitpid kernel/exit.c pid_t unsigned int * int - -
8 sys_creat fs/open.c const char * int - - -
9 sys_link fs/namei.c const char * const char * - - -
10 sys_unlink fs/namei.c const char * - - - -
11 sys_execve arch/i386/kernel/process.c struct pt_regs - - - -
12 sys_chdir fs/open.c const char * - - - -
13 sys_time kernel/time.c int * - - - -
14 sys_mknod fs/namei.c const char * int dev_t - -
15 sys_chmod fs/open.c const char * mode_t - - -
16 sys_lchown fs/open.c const char * uid_t gid_t - -
18 sys_stat fs/stat.c char * struct __old_kernel_stat * - - -
19 sys_lseek fs/read_write.c unsigned int off_t unsigned int - -
20 sys_getpid kernel/sched.c - - - - -
21 sys_mount fs/super.c char * char * char * - -
22 sys_oldumount fs/super.c char * - - - -
23 sys_setuid kernel/sys.c uid_t - - - -
24 sys_getuid kernel/sched.c - - - - -
25 sys_stime kernel/time.c int * - - - -
26 sys_ptrace arch/i386/kernel/ptrace.c long long long long -
27 sys_alarm kernel/sched.c unsigned int - - - -
28 sys_fstat fs/stat.c unsigned int struct __old_kernel_stat * - - -
29 sys_pause arch/i386/kernel/sys_i386.c - - - - -
30 sys_utime fs/open.c char * struct utimbuf * - - -
33 sys_access fs/open.c const char * int - - -
34 sys_nice kernel/sched.c int - - - -
36 sys_sync fs/buffer.c - - - - -
37 sys_kill kernel/signal.c int int - - -
38 sys_rename fs/namei.c const char * const char * - - -
39 sys_mkdir fs/namei.c const char * int - - -
40 sys_rmdir fs/namei.c const char * - - - -
41 sys_dup fs/fcntl.c unsigned int - - - -
42 sys_pipe arch/i386/kernel/sys_i386.c unsigned long * - - - -
43 sys_times kernel/sys.c struct tms * - - - -
45 sys_brk mm/mmap.c unsigned long - - - -
46 sys_setgid kernel/sys.c gid_t - - - -
47 sys_getgid kernel/sched.c - - - - -
48 sys_signal kernel/signal.c int __sighandler_t - - -
49 sys_geteuid kernel/sched.c - - - - -
50 sys_getegid kernel/sched.c - - - - -
51 sys_acct kernel/acct.c const char * - - - -
52 sys_umount fs/super.c char * int - - -
54 sys_ioctl fs/ioctl.c unsigned int unsigned int unsigned long - -
55 sys_fcntl fs/fcntl.c unsigned int unsigned int unsigned long - -
57 sys_setpgid kernel/sys.c pid_t pid_t - - -
59 sys_olduname arch/i386/kernel/sys_i386.c struct oldold_utsname * - - - -
60 sys_umask kernel/sys.c int - - - -
61 sys_chroot fs/open.c const char * - - - -
62 sys_ustat fs/super.c dev_t struct ustat * - - -
63 sys_dup2 fs/fcntl.c unsigned int unsigned int - - -
64 sys_getppid kernel/sched.c - - - - -
65 sys_getpgrp kernel/sys.c - - - - -
66 sys_setsid kernel/sys.c - - - - -
67 sys_sigaction arch/i386/kernel/signal.c int const struct old_sigaction * struct old_sigaction * - -
68 sys_sgetmask kernel/signal.c - - - - -
69 sys_ssetmask kernel/signal.c int - - - -
70 sys_setreuid kernel/sys.c uid_t uid_t - - -
71 sys_setregid kernel/sys.c gid_t gid_t - - -
72 sys_sigsuspend arch/i386/kernel/signal.c int int old_sigset_t - -
73 sys_sigpending kernel/signal.c old_sigset_t * - - - -
74 sys_sethostname kernel/sys.c char * int - - -
75 sys_setrlimit kernel/sys.c unsigned int struct rlimit * - - -
76 sys_getrlimit kernel/sys.c unsigned int struct rlimit * - - -
77 sys_getrusage kernel/sys.c int struct rusage * - - -
78 sys_gettimeofday kernel/time.c struct timeval * struct timezone * - - -
79 sys_settimeofday kernel/time.c struct timeval * struct timezone * - - -
80 sys_getgroups kernel/sys.c int gid_t * - - -
81 sys_setgroups kernel/sys.c int gid_t * - - -
82 old_select arch/i386/kernel/sys_i386.c struct sel_arg_struct * - - - -
83 sys_symlink fs/namei.c const char * const char * - - -
84 sys_lstat fs/stat.c char * struct __old_kernel_stat * - - -
85 sys_readlink fs/stat.c const char * char * int - -
86 sys_uselib fs/exec.c const char * - - - -
87 sys_swapon mm/swapfile.c const char * int - - -
88 sys_reboot kernel/sys.c int int int void * -
89 old_readdir fs/readdir.c unsigned int void * unsigned int - -
90 old_mmap arch/i386/kernel/sys_i386.c struct mmap_arg_struct * - - - -
91 sys_munmap mm/mmap.c unsigned long size_t - - -
92 sys_truncate fs/open.c const char * unsigned long - - -
93 sys_ftruncate fs/open.c unsigned int unsigned long - - -
94 sys_fchmod fs/open.c unsigned int mode_t - - -
95 sys_fchown fs/open.c unsigned int uid_t gid_t - -
96 sys_getpriority kernel/sys.c int int - - -
97 sys_setpriority kernel/sys.c int int int - -
99 sys_statfs fs/open.c const char * struct statfs * - - -
100 sys_fstatfs fs/open.c unsigned int struct statfs * - - -
101 sys_ioperm arch/i386/kernel/ioport.c unsigned long unsigned long int - -
102 sys_socketcall net/socket.c int unsigned long * - - -
103 sys_syslog kernel/printk.c int char * int - -
104 sys_setitimer kernel/itimer.c int struct itimerval * struct itimerval * - -
105 sys_getitimer kernel/itimer.c int struct itimerval * - - -
106 sys_newstat fs/stat.c char * struct stat * - - -
107 sys_newlstat fs/stat.c char * struct stat * - - -
108 sys_newfstat fs/stat.c unsigned int struct stat * - - -
109 sys_uname arch/i386/kernel/sys_i386.c struct old_utsname * - - - -
110 sys_iopl arch/i386/kernel/ioport.c unsigned long - - - -
111 sys_vhangup fs/open.c - - - - -
112 sys_idle arch/i386/kernel/process.c - - - - -
113 sys_vm86old arch/i386/kernel/vm86.c unsigned long struct vm86plus_struct * - - -
114 sys_wait4 kernel/exit.c pid_t unsigned long * int options struct rusage * -
115 sys_swapoff mm/swapfile.c const char * - - - -
116 sys_sysinfo kernel/info.c struct sysinfo * - - - -
117 sys_ipc (*Note) arch/i386/kernel/sys_i386.c uint int int int void *
118 sys_fsync fs/buffer.c unsigned int - - - -
119 sys_sigreturn arch/i386/kernel/signal.c unsigned long - - - -
120 sys_clone arch/i386/kernel/process.c struct pt_regs - - - -
121 sys_setdomainname kernel/sys.c char * int - - -
122 sys_newuname kernel/sys.c struct new_utsname * - - - -
123 sys_modify_ldt arch/i386/kernel/ldt.c int void * unsigned long - -
124 sys_adjtimex kernel/time.c struct timex * - - - -
125 sys_mprotect mm/mprotect.c unsigned long size_t unsigned long - -
126 sys_sigprocmask kernel/signal.c int old_sigset_t * old_sigset_t * - -
127 sys_create_module kernel/module.c const char * size_t - - -
128 sys_init_module kernel/module.c const char * struct module * - - -
129 sys_delete_module kernel/module.c const char * - - - -
130 sys_get_kernel_syms kernel/module.c struct kernel_sym * - - - -
131 sys_quotactl fs/dquot.c int const char * int caddr_t -
132 sys_getpgid kernel/sys.c pid_t - - - -
133 sys_fchdir fs/open.c unsigned int - - - -
134 sys_bdflush fs/buffer.c int long - - -
135 sys_sysfs fs/super.c int unsigned long unsigned long - -
136 sys_personality kernel/exec_domain.c unsigned long - - - -
138 sys_setfsuid kernel/sys.c uid_t - - - -
139 sys_setfsgid kernel/sys.c gid_t - - - -
140 sys_llseek fs/read_write.c unsigned int unsigned long unsigned long loff_t * unsigned int
141 sys_getdents fs/readdir.c unsigned int void * unsigned int - -
142 sys_select fs/select.c int fd_set * fd_set * fd_set * struct timeval *
143 sys_flock fs/locks.c unsigned int unsigned int - - -
144 sys_msync mm/filemap.c unsigned long size_t int - -
145 sys_readv fs/read_write.c unsigned long const struct iovec * unsigned long - -
146 sys_writev fs/read_write.c unsigned long const struct iovec * unsigned long - -
147 sys_getsid kernel/sys.c pid_t - - - -
148 sys_fdatasync fs/buffer.c unsigned int - - - -
149 sys_sysctl kernel/sysctl.c struct __sysctl_args * - - - -
150 sys_mlock mm/mlock.c unsigned long size_t - - -
151 sys_munlock mm/mlock.c unsigned long size_t - - -
152 sys_mlockall mm/mlock.c int - - - -
153 sys_munlockall mm/mlock.c - - - - -
154 sys_sched_setparam kernel/sched.c pid_t struct sched_param * - - -
155 sys_sched_getparam kernel/sched.c pid_t struct sched_param * - - -
156 sys_sched_setscheduler kernel/sched.c pid_t int struct sched_param * - -
157 sys_sched_getscheduler kernel/sched.c pid_t - - - -
158 sys_sched_yield kernel/sched.c - - - - -
159 sys_sched_get_priority_max kernel/sched.c int - - - -
160 sys_sched_get_priority_min kernel/sched.c int - - - -
161 sys_sched_rr_get_interval kernel/sched.c pid_t struct timespec * - - -
162 sys_nanosleep kernel/sched.c struct timespec * struct timespec * - - -
163 sys_mremap mm/mremap.c unsigned long unsigned long unsigned long unsigned long -
164 sys_setresuid kernel/sys.c uid_t uid_t uid_t - -
165 sys_getresuid kernel/sys.c uid_t * uid_t * uid_t * - -
166 sys_vm86 arch/i386/kernel/vm86.c struct vm86_struct * - - - -
167 sys_query_module kernel/module.c const char * int char * size_t size_t *
168 sys_poll fs/select.c struct pollfd * unsigned int long - -
169 sys_nfsservctl fs/filesystems.c int void * void * - -
170 sys_setresgid kernel/sys.c gid_t gid_t gid_t - -
171 sys_getresgid kernel/sys.c gid_t * gid_t * gid_t * - -
172 sys_prctl kernel/sys.c int unsigned long unsigned long unsigned long unsigned long
173 sys_rt_sigreturn arch/i386/kernel/signal.c unsigned long - - - -
174 sys_rt_sigaction kernel/signal.c int const struct sigaction * struct sigaction * size_t -
175 sys_rt_sigprocmask kernel/signal.c int sigset_t * sigset_t * size_t -
176 sys_rt_sigpending kernel/signal.c sigset_t * size_t - - -
177 sys_rt_sigtimedwait kernel/signal.c const sigset_t * siginfo_t * const struct timespec * size_t -
178 sys_rt_sigqueueinfo kernel/signal.c int int siginfo_t * - -
179 sys_rt_sigsuspend arch/i386/kernel/signal.c sigset_t * size_t - - -
180 sys_pread fs/read_write.c unsigned int char * size_t loff_t -
181 sys_pwrite fs/read_write.c unsigned int const char * size_t loff_t -
182 sys_chown fs/open.c const char * uid_t gid_t - -
183 sys_getcwd fs/dcache.c char * unsigned long - - -
184 sys_capget kernel/capability.c cap_user_header_t cap_user_data_t - - -
185 sys_capset kernel/capability.c cap_user_header_t const cap_user_data_t - - -
186 sys_sigaltstack arch/i386/kernel/signal.c const stack_t * stack_t * - - -
187 sys_sendfile mm/filemap.c int int off_t * size_t -
190 sys_vfork arch/i386/kernel/process.c struct pt_regs
cdimauro
11-08-2014, 07:27
Visto che hai usato la sys_write prima, probabilmente per leggere l'input da tastiera dovrai usare la sys_read, usando 0 come file handle (stdin).
Il problema è come leggere i tasti cursore. Dovresti cercare nella documentazione della sys_read e vedere come fare.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.