Autore Topic: Esercizio Assembly Help  (Letto 3050 volte)

pierj88

  • Newbie
  • *
  • Post: 0
  • Gioco Preferito: prince of persia
Esercizio Assembly Help
« il: 13 Gennaio 2010, 12:55:43 »
 Ciao a tutti, qualcuno mi può dire come va svolto questo tipo di esercizio riguardante l'assembly del 8086??  :confused:

inserire da tastiera nome cognome e una cifra da 1 a 9
fare questa operazione
[nome - cognome] * numero inserito
nome e cognome sono il numero di lettere che compongono il nome e il
cognome

se il risultato è positivo inserire in una variabile password il
numero inserito seguito dalle prime 3 lettere del nome
se negativo il numero seguito dalle prime 3 lettere del cognome

e stampare la password generata

Grazie a tutti quelli che mi risponderanno.  ;)
 

Freshness79

  • Utente
  • **
  • Post: 128
  • Gioco Preferito: Dizzy collection
Esercizio Assembly Help
« Risposta #1 il: 15 Gennaio 2010, 00:42:18 »
 Ciao Pier,
 é un po' che non prendo in mano l'8086, non mi é mai piaciuto granché come assemblativo: spero per te ti facciano imparare un po' di 68000, quello si a mio avviso é veramente educativo!
Comunque sia, in allegato sorgente di quello di cui avevi bisogno... non é propriamente il sito adatto ma... vabbè, non ho resistito a buttar giù due righe.
Unica nota: nel tentativo di renderla "riutilizzabile", la routine di mascheramento dell'input non é esattamente delle più ottimizzate ma... fa comunque il suo mestiere.
Scarica emu8086 - ottimo ambiente di lavoro peraltro - e compila in .com con quello.

Codice: [Seleziona]
; Area codice

org 100h


; Procedura principale

; *****************
; Introduzione dati
; *****************

    mov AX,DS
    mov ES,AX
    
    lea DX,nome
    mov AH,9
    int 21h        
    lea SI,mask1
    lea BP,salvanome
    mov BX,3
    mov CX,maxlenght    
    call input
    push DI  
    lea DX,acapo
    mov AH,9
    int 21h
    
    lea DX,cognome
    mov AH,9
    int 21h        
    lea SI,mask1                
    lea BP,salvacognome
    mov BX,3    
    mov CX,maxlenght
    call input    
    push DI
    lea DX,acapo
    mov AH,9
    int 21h    
    
    lea DX,numero    
    int 21h    
    lea SI,mask2
    lea BP,password
    mov BX,1
    mov CX,1
    call input      
    
; *****************
; Introduzione dati
; *****************
    
;    lea DI,salvanome
;    call strlen
;    mov AX,DI
;    lea DI,salvacognome
;    call strlen
    pop BX
    pop AX
    sub AX,BX
    mov BL,[password]
    xor BH,BH    
    sub BX,"0"
    lea DI,[password+1]
    mov CX,3    
    imul BX
    test DH,80h
    js  negpwd
pospwd:  
    lea SI,[salvanome]    
    jmp printpwd
negpwd:          
    lea SI,[salvacognome]
printpwd:
    rep movsb
    mov AH,9
    lea DX,acapo
    int 21h
    lea DX,textpwd
    int 21h                    
    lea DX,password    
    int 21h        
    ret      


; ********
; FUNZIONI
; ********

; Input controllato di una stringa
; Ingresso: BP (Indirizzo di salv. stringa)
;           SI (Indirizzo maschera)
;           BX (Minimo numero di caratteri)
;           CX (Massimo numero di caratteri)          
; Non preserva i registri

input:  
    xor DI,DI    
insert:                                            
    mov AH,7
    int 21h  
    cmp AL,13
    je  insert_check
    call maskchars
    je  Insert
    cmp AL,8
    jne nobackspace
    cmp DI,0
    je  insert    
    dec DI    
    mov AH,2    
    mov DL,8        
    int 21h
    mov DL,32    
    int 21h
    mov DL,8    
    int 21h
    jmp insert
nobackspace:    
    cmp DI,CX
    je  insert
    mov [BP+DI],AL
    mov DL,AL
    mov AH,2
    int 21h    
    inc DI
    jmp insert
insert_check:
    cmp DI,BX
    jl  insert
    mov [BP+DI],0  
    ret    

                      
; Mascheratura di input
; Ingresso: AL (carattere da cercare)
;           SI (Indirizzo maschera)
; Uscita: Zero Flag: 0 - Non trovato
;                    1 - Trovato
; Preserva i registri

maskchars:
    push SI
    push AX
    mov AH,AL
msk_loop:      
    lodsb
    cmp AL,0
    je  msk_notfound
    cmp AL,AH
    jne msk_loop    
msk_found:
    cmp AL,0
msk_notfound:
    pop AX
    pop SI
    ret
    

; *********
; Area dati
; *********
          
maxlenght equ 20          


; Stringhe da stampare  

nome db "Inserire nome: $"
cognome db "Inserire cognome: $"
numero db "Inserire numero: $"
textpwd db "Password generata: $"
acapo db 10,13,"$",0


; Maschere di input

mask1 db "abcdefghjkilmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ",8,0
mask2 db "123456789",8,0


; Stringhe da salvare

salvanome       db maxlenght dup (0)
salvacognome    db maxlenght dup (0)
password        db 0,3 dup (0),"$"