Visualizzazione dei risultati da 1 a 9 su 9

Discussione: [ASSEMBLER] Memoria

  1. #1

    [ASSEMBLER] Memoria

    Ciao a tutti...
    Vorrei creare un programmino assembler per stampare a video cio che è presente in memoria in un determinato indirizzo...ad esempio 1A1A...Poi se volete vorrei anche sapere come cambiare il segmento di Ram per esplorare quanto voglio...GRAZIE IN ANTICIPO!!!
    Alessio_Programmer

  2. #2
    Utente di HTML.it L'avatar di cso
    Registrato dal
    Aug 2004
    Messaggi
    2,050
    SI e DI sono dei puntatori nella memoria ram.
    se vuoi puntare nell'indirizzo 1000 della ram fai
    codice:
    mov si,1000
    se invece vuoi mettere nell'indirizzo 1000 della ram il valore 55 devi fare così
    codice:
    mov si,1000
    mov [si],55
    analogo il discorso per DI con cui puoi svolgere le stesse funzioni.
    per quanto riguarda il programma che hai chiesto:
    codice:
           mov cx,500
           mov si,1000 ;per convenzione si lavoro sempre da 1000 in poi
    ciclo: mov al,[si]
           mov ah,0eh
           int 10h
           inc si
           loop ciclo

  3. #3
    Forse non mi sono spiegato :P
    Non ho problemi di Assembler...so come si fanno quelle cose.
    Io devo creare 1 programma che mi STAMPA A VIDEO il CONTENUTO di un INDIRIZZO DI MEMORIA (ad esempio 1A1A)
    Alessio_Programmer

  4. #4
    Utente di HTML.it L'avatar di cso
    Registrato dal
    Aug 2004
    Messaggi
    2,050
    Ok, allora:
    codice:
           mov si,1A1A
           mov ax,si
           mov dx,ax
           mov ah,0eh
           int 10h       ;stampa al
           mov al,dh
           int 10h       ;stampa ah
    essendo l'indirizzo un numero è come stampare un numero :P

  5. #5
    Mi disp ma non funziona

    Lo ho messo il programma ma mi stampa a video cosi:

    ->->

    Non capisco perche...ho provato a creare anche un loop di 10 per poter magari vedere gli altri indirizzi ma comunque stampa a video:

    ->->

    Cosa puo essere?

    Grazie!
    Alessio_Programmer

  6. #6
    Utente di HTML.it L'avatar di cso
    Registrato dal
    Aug 2004
    Messaggi
    2,050
    perchè non viene trattato come numero.
    se vuoi renderlo tale devi aggiungergli 48 ==> 30h ==> 110000b perchè è quello che gli manca per diventare un vero numero (guarda l'ascii 48)
    ti posto questo codice di esempio, naturalmente devi trattare 1A1A singolarmente quindi fare delle maschere per poi darlo uno alla volta al registro AL per stamparlo a video:
    codice:
    dosseg
    .model tiny
    .code
    org 100h
    main:
           mov si,01
           mov dx,si
           and dl,00001111b
           add dl,110000b
           mov al,dl
           mov ah,0eh
           int 10h
           mov ah,4ch
           int 21h
           end main

  7. #7
    Kiedo tantissime scuse!Ma non ho capito cosa hai fatto se puoi commenta ke sinceramente non ci ho capito niente niente niente...e poi qnd mi fa vedere il contenuto di 1A1A?

    Ciao ciao!
    Alessio_Programmer

  8. #8
    Utente di HTML.it L'avatar di cso
    Registrato dal
    Aug 2004
    Messaggi
    2,050
    Originariamente inviato da Arthemis
    ...
    Non ho problemi di Assembler
    ...

    se vuoi domani provo a farti il programma perchè sinceramente alle 9 e tre quarti non è che riesco a ragionare cmq...
    codice:
    dosseg
    .model tiny
    .code
    org 100h                ;fino a qui per far funzionare il codice con il tasm
    main:
           mov si,01
           mov dx,si
           and dl,00001111b ;cancella tutto tranne la prima lettera
                            ;in questo caso è l'1 la prima lettera
           add dl,110000b   ;ci aggiungo 48 per trasformarlo in numero
                            ;perchè 1 in ascii è ☺ mentre 48+1 è 1
           mov al,dl        ;il resto lo dovresti sapere :D
           mov ah,0eh
           int 10h
           mov ah,4ch
           int 21h
           end main

  9. #9
    La lettura della memoria fisica non è il vero problema da risolvere: qualunque processore recupera il suo contenuto (un byte, 8bit) con una sola istruzione, per esempio MOV AL, ES:[DI] , che lascia nel suo registro accumulatore AL il byte contenuto nella locazione puntata da ES: DI , il puntatore caricato con l'indirizzo logico corrispondente a quello fisico desiderato.

    L'indirizzo logico si predispone caricando i due registi ES e DI con le desiderate parti d'indirizzo fisico ; per esempio per scaricare il contenuto dell'indirizzo 001A8H si può usare questo codice:

    codice:
    	MOV	AX,0000H
    	MOV	ES,AX
    	MOV	DI,01A8H
    	MOV	AL,ES:[DI]
    Il problema grosso è ora interpretare a video il valore binario presente in AL: la cosa non è banale e serve un algoritmo di conversione adatto allo scopo ; lo stesso vale per mostrare a video l'indirizzo segmentato della locazione sorgente del dato.

    In definitiva si tratta di scrivere 2 procedure specializzate, da Byte o da Word a stringa ascii esadecimale; un esempio concreto (... fatti, non parole) lo puoi vedere nella seguente figura:

    che mostra l'effetto di un codice che legge le prime 128 locazioni della Memoria RAM e ne mostra il valore esadecimale, in gruppi di 16, come DEBUG.. In aggiunta mostra l'indirizzo segmentato di ogni gruppo.
    Ogni dettaglio del progetto è disponibile qui .

    codice:
                          Giobe®2000 - Tutto sull'Assembly    - Lezioni, programmi, segreti, trucchi

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.