|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Aug 2004
Città: Palermo
Messaggi: 1079
|
Aiuto programma assembler
Salve a tutti sto provando a scrivere un programma assembler x86 che prendendo una stringa del tipo "6 444 1 7 444 2 222 33" (tasti battuti sulla tastiera del telefonino) la trasforma in testo ("mi piaci" in questo esempio), tutto in assembler solo che non mi funziona niente e comincio ad avere errori sin dall'inizio del programma.
Codice:
.model small .stack .data tastiera db ' ', '&', '&', '&' db 'a', 'b', 'c', '&' db 'd', 'e', 'f', '&' db 'g', 'h', 'i', '&' db 'j', 'k', 'l', '&' db 'm', 'n', 'o', '&' db 'p', 'q', 'r', 's' db 't', 'u', 'v', 'x' db 'w', 'x', 'y', 'z' risultato db 15 dup(?) ingresso db "6 444 1 7 444 2 222 33" .code .startup xor si,si lea ax, tastiera; tastiera lea bx, ingresso; ingresso lea dx, risultato; stringa finale mov cx, 8 ; numero caratteri dec cx ;decremento il numero di rilevazioni push ax push bx push dx push cx call messaggio add sp,8 ; perchè sto inserendo 4 parametri jmp fine messaggio proc push bp mov bp, sp sub sp, 2 xor dx, dx mov cx, [bp+4] ; numero caratteri mov bx, [bp+6] ; risultato mov si, [bp+8] ; ingresso mov di, [bp+10]; tastiera xor ax, ax; azzero ax ciclo: mov dl, [si]; sposto il carattere in dl cmp dl, ' ' ;confronto dl con lo spazio jne continua ; se non è spazio vado a continua aggiungi: sub al, 30h ;altrimenti continuo trasformando il carattere in numero decimale dec al; decremento per trovare la riga add ah, al mov [bp-2], word ptr 0 add [bp-2], ah add [bp-2], di xor ax, ax mov al, [bp-2];seleziono il carattere dalla riga mov [bx], al add [bx], word ptr 1; avanzo nella stringa risultato xor ax, ax; azzero ax dec cx ; decremento cx jmp ciclo continua: cmp cx,1 jne normale cmp al, dl jne aggiungi normale: mov al, dl ;in continua metto dl in al inc ah; incremento ah add [si], word ptr 1 loop ciclo mov [bx], byte ptr 0 add sp, 2 pop bp ret messaggio endp fine: lea dx, risultato mov ah, 09h int 21h .exit end Io conosco la stringa in ingresso, conosco la dimensione della stringa in uscita 8 e non la dimensione della stringa di ingresso. Io ho provato a scrivere la procedura come si può vedere dal codice incollato (devo necessariamente utilizzare una procedura) ma ho dei problemi non indifferenti, prima di tutto quando metto il valore 8 nel registro CX, proprio all'inizio del programma, non so perchè mi spunta il valore E008 anche avendo prima azzerato CX, com'è possibile? Quando prendo il valore dalla procedura mi spuntano valori che non c'entrano niente con il valore che dovrebber ricevere la procedura (cioè 7). Poi sempre nella procedura, sembra che mi venga preso correttamente l'offset della stringa di ingresso solo che c'è un problema con la: cmp dl, ' ' jne salta in pratica questo confronto risulta sempre diverso e non capisco il perchè. Qualcuno può aiutarmi a capire i vari errori perchè non riesco a capirci più nulla. Grazie a tutti, ciao ciao. |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 21:44.