Forum by laureateci.it
[ Home | REGOLE FORUM | Tutti i blog | Profilo | Registrati | CHAT | Discussioni Attive | Discussioni Recenti | Segnalibro | Msg privati | Sondaggi Attivi | Utenti | Download Informatica | Download ICD | Download TPS | Download Magistrale | Download Specialistica | Giochi | Cerca nel web | cerca | faq | RSS ]
Nome Utente:
Password:
Salva Password
Password Dimenticata?

 Tutti i Forum
 INFORMATICA - Primo Anno
 Architettura degli elaboratori
 eserizio in assembler (HELP!!)

Nota: Devi essere registrato per poter inserire un messaggio.
Per registrarti, clicca qui. La Registrazione è semplice e gratuita!

Larghezza finestra:
Nome Utente:
Password:
Modo:
Formato: GrassettoCorsivoSottolineatoBarrato Aggiungi Spoiler Allinea a  SinistraCentraAllinea a Destra Riga Orizzontale Inserisci linkInserisci EmailInserisci FlashInserisci Immagine Inserisci CodiceInserisci CitazioneInserisci Lista Inserisci Faccine
   
Icona Messaggio:              
             
Messaggio:

  * Il codice HTML è OFF
* Il Codice Forum è ON

Smilies
Approvazione [^] Arrabbiato [:(!] Bacio [:X] Bevuta [:273]
Caldo [8D] Compiaciuto [8)]    
compleanno [:269]
Davvero Felice [:D] Diavoletto [}:)] Disapprovazione [V] Domanda [?]
Felice [:)] Fumata [:29] Goloso [:P] Imbarazzato [:I]
Infelice [:(] Morte improvvisa da [:62]
Morto [xx(] Occhio Nero [B)] Occhiolino [;)] Palla 8 [8]
pc [:205]    
Riproduzione [:76]
Scioccato [:O]      

   Allega file
  Clicca qui per inserire la tua firma nel messaggio.
Clicca qui per sottoscrivere questa Discussione.
    

V I S U A L I Z Z A    D I S C U S S I O N E
sgorry84 Inserito il - 10/02/2004 : 16:01:07
RAGà io ho provato ha svolgere la traccia della prova di Anelli di gennaio... secondo me dovrebbe funzionare, ma quando lo mando in esecuzione non succede niente! mika ho kapito perkè! date voi un'okkiata, ke il cervello lo portate sempre kon voi!
GRAZIE 1000!!

STACK SEGMENT PARA STACK
DB 64 DUP ('HYSTACK')
STACK ENDS

DATI SEGMENT PARA
VETT DB 050H, 0A8H, 040H
DUE DB 02H
DIS DB 0
TOT DB 0
NUMERI DB '0123456789ABCDEF'
TESTO DB 'IL TOTALE DI NUMERI PARI è ', 0DH, 0AH, '$'
ASCII_T DB ?
DATI ENDS

CODICE SEGMENT PARA
ASSUME CS:CODICE, DS:DATI, SS:STACK
MAIN PROC FAR
PUSH DS
SUB AX, AX
PUSH AX
MOV AX, DATI
MOV DS, AX
; **************

; **************
LEA BX, VETT
MOV AX, 0
MOV CX, 03
CICLO: MOV AL, VETT[BX] ;metti in AL il BX° elemento di VETT
DIV DUE ;dividi per 2
CMP DX, 00H ;confronta il resto con 0
JE PARI ;se il resto =0 vai a PARI
JA DISPARI ;se il resto è >0 vai a DISPARI
PARI: INC TOT ;se il numero è pari, incrementa TOT
DISPARI: ADD DIS, AL ;se il numero è dispari, somma il numero a DIS
ADD BX, 01H ;referenzia l'elemento successivo
LOOP CICLO ;fine del ciclo
MOV BL, TOT ;metti il risultato in BL
CALL SCRIVI ;chiama SCRIVI
MOV ASCII_T, BH ;metti la stinga in ASCII_T
; **************
scrivi proc near
; Subroutine che converte un byte in due caratteri ASCII
; input in BL - Out in BX
push dx
mov bh,0
push bx
and bx,0fh
add bx,offset numeri
mov dl,[bx]
pop bx
and bx,0f0h
mov cl,4
shr bx,cl
add bx,offset numeri
mov dh,[bx]
mov bx,dx
pop dx
ret
scrivi endp
; **************
LEA BX, TESTO
MOV AH, 09H
INT 21H
LEA BX, ASCII_T
MOV AH, 09H
INT 21H
RET
; ****
MAIN ENDP
CODICE ENDS
END MAIN


14   U L T I M E    R I S P O S T E    (in alto le più recenti)
laureatemi Inserito il - 13/04/2004 : 20:38:55
raga qual'e il codice esadecimale del tasto ENTER?
Inoltre quali sono gli altri codici dei tasti della tastiera?

Sapete dove posso recuperare esempi di prove di laboratorio di ASSEMBLY?

Continuate cosi siete FORTI!
pixel Inserito il - 03/04/2004 : 15:19:09
hola raga!sono un nuovo iscritto,
nn sono molto pratico di asm,volevo creare un programma che mi desse un controllo su numeri pari/dispari,in realtà il programma ha qualcosa che nn va.vi scrivo il listato,se mi aiutate mi fareste un grande favore.thanks


.model small
.stack 400h
.data

max_num equ 5
msg1 db 10,13,"inserisci un numero",10,13,'$'
msg2 db 10,13,"il numero",10,13,'$'
msg3 db 10,13,"e pari",10,13,'$'
msg4 db 10,13,"e dispari",10,13,'$'
msg5 db 10,13,"errore,inserisci un numero",10,13,'$'

.code

start:
xor cx,cx
push cx

leggi: mov ax,seg msg1 ;visualizzo il primo msg
mov ds,ax
mov dx,offset msg1

mov ah,09h
int 21h


mov cx,max_num ;inizializzo il contatore a 5

mov ah,01h ;leggo il carattere da tastiera
int 21h

cmp al,30h ;se nn è un numero dà errore
jl errore
cmp al,39h
jg errore

dec cx
cmp cx,0
jz fine

sub al,30h

mov dl,al
mov dh,0
push dx

parte2:
mov dx,offset msg2
mov ah,09h
int 21h

call paridispari

jmp leggi


paridispari proc near

push bp
mov bp,sp

inizio:
xor ax,ax
xor bx,bx

mov al,[bp+4]
mov bl,2
div bl
cmp ah,0
jz pari

dispari:
mov dx,offset msg4
mov ah,09h
int 21h
jmp fineproc
pari:
mov dx,offset msg3
mov ah,09h
int 21h

fineproc:
pop dx
pop bp

ret

paridispari endp

fine:
pop cx
mov ah,4ch
int 21h

errore:
mov dx,offset msg5
mov ah,09h
int 21h
jmp leggi

end start

ps. e se volessi usare un vetore x immagazinre i numeri?
Lamia Inserito il - 15/02/2004 : 16:31:06
silent innanzitutto il main proc far e'sbagliato..adesso ti scrivo il programma corretto con i commenti affianco:

stack segment para 'stack'
db 200 dup(0)
stack ends
data segment para public 'data'
N_CIFRE equ 8
num1 dw '1,2,3,4,5,6,7,8'
num2 dw '1,2,3,4,5,6,7,8'
ris dw 8 dup('0')
numeri db '0123456789ABCDEF'
sep dw ', $'
strinvet dw 'i valori del vettore-somma sono: $'
data ends
CODE SEGMENT PARA PUBLIC 'CODE'
MAIN PROC FAR
ASSUME CS:CODE
PUSH DS
XOR AX,AX
PUSH AX
MOV AX,data
MOV ES,AX
ASSUME ES:DATA
MOV DS,AX
ASSUME DS:DATA
;------------------MAIN-------------------
;(la divisione in partizioni e'utile)
;mi sembra di aver capito che vuoi sommare
;gli elementi del vettore che si tovano
;in corrispondenza dello stesso indice
;la label 'start:'nn serve a niente se tu nn la citi mai
call sommacifre ;la procedura sommacifre la devi
;chiamare non puoi metterla in mezzo
;al main a cavolo
call stampavet

ret
;---------------PROCEDURE---------------------------------
sommacifra proc near
xor si,si
xor di,di
mov cx,N_CIFRE
inizio:
xor ax,ax ;devi azzerare un registro prima di usarlo
mov ax,num1[si]
add ax,num2[si] ;il risultatato dell'addizione
mov ris[di],ax ;potrebbe occupare + di meta'registro
inc di ;xcio'e'meglio se dichiari tutto come dw
inc si ;x poter utilizzare tutto ax
loop inizio ;loop sommacifra e' sbagliato xche'il loop
;deve fare riferimento a una label e nn al nome
;di una procedura
;e ricorda che il loop x default decrementa il valore di cx

xor di,di
mov cx,N_CIFRE
ascii:
add ris[di],30h
inc di
loop ascii
RET
sommacifra ENDP
;-------------------------------------------------------------
stampavet proc near
lea dx,strinvet ;usando lea eviti di specificare offset etc.
mov ah,09
int 21h

;per stamparis nn devi usare 09 int 21h che si usa solo con
;le stringhe bensi'usa ah,02 int 21h
;inoltre ti conviene definirla come un'altra procedura visto
;che e'lunga e con una traccia diversa ti sarebbe potuta servire
;+ spesso e da sola

xor di,di
stamparis:
xor dx,dx
mov dl,ris[di]
mov ah,02
int 21h ;stampa sullo schermo il carattere in dl
inc di
cmp di,N_CIFRE
jb comma
jmp cont
comma:
lea dx,sep
mov ah,09
int 21h
cont:
loop stamparis

xor dx,dx
mov dl,10
mov ah,02
int 21h
ret
stampavet endp

;---------------------------------------------
MAIN ENDP
CODE ENDS
END MAIN


cosi'dovrebbe funzionare
silent Inserito il - 14/02/2004 : 21:43:54
solo quello è il problema ho c'è ne un altro??
MnK Inserito il - 14/02/2004 : 18:15:17
per prima cosa nel vettore ris stanno 9 elementi messi a 0. invece di 8..

MnK Inserito il - 14/02/2004 : 18:08:20
ehm io l'ho visto il programma ... ti assicuro che nn fa la somma di 2 numeri....
silent Inserito il - 11/02/2004 : 19:15:34
valenzano è la somma di due numeri
valenzanocity Inserito il - 11/02/2004 : 18:55:14
come 4? a me esce 3 e se aggiungo altri numeri cambia. Vedilo meglio e poi per il dispari basta che stampi la variabile dis visto che il calcolo è già fatto.
Devi fare la prova venerdì?
sgorry84 Inserito il - 11/02/2004 : 18:37:40
valenzano ma sei sicuro che funzioni?
l'ho appena eseguito e questo è il risultato:
"IL TOTALE DI NUMERI PARI è: 4"

Il che è impossibile,perkè il vettore ha solo tre elementi, e poi i sidpari ke fine fanno?

Cmq, grazie tantissimo!
valenzanocity Inserito il - 11/02/2004 : 18:06:07
silent e la traccia?
silent Inserito il - 11/02/2004 : 17:05:37
scusate qualcuno mi può dire perchè non gira questo esercizio:

stack segment para 'stack'
db 200 dup(0)
stack ends
data segment para 'data'
N_CIFRE equ 8
num1 db '1,2,3,4,5,6,7,8',
num2 db '8,7,6,5,4,3,2,1',
ris db '0,0,0,0,0,0,0,0,0','$'
numeri db '0123456789ABCDEF'
data ends
code segment para
main proc far
assume cs:code,ds:data,es:data,ss:stack
mov ah,0fh
int 10h
mov ah,0
int 10h
mov ax,data
mov ds,ax
mov es,ax

start:
mov cx,N_CIFRE
mov di,cx
mov si,N_CIFRE-1
sommacifra proc near
mov al,num1[si]
mov al,num2[si]
mov ris[di],al
dec di
dec si
loop sommacifra
mov ris[di],0
inc ris[di]
mov cx,N_CIFRE+1
mov di,0

ascii:
add ris[di],30h
inc di
loop ascii

stamparis:
mov ah,09h
mov dx,OFFSET ris
int 21h

RET
sommacifra ENDP
code ends
END main

non riesco a capire dove sia l'errore
valenzanocity Inserito il - 11/02/2004 : 12:11:22
Ti invio il programma rivisto e corretto.
n.b.:maiuscolo e minuscolo sono cose diverse in assembler; le stringhe in output vanno assegnate al registro data(dx)
lf equ 0ah
cr equ 0dh
tp equ '$'

STACK SEGMENT PARA STACK
DB 64 DUP ('HYSTACK')
STACK ENDS

DATI SEGMENT PARA
VETT DB 050H, 0A8H, 040H
DUE DB 02H
DIS DB 0
TOT DB 0
NUMERI DB '0123456789ABCDEF'
TESTO DB lf,'IL TOTALE DI NUMERI PARI e: ',tp
ASCII_T DB ?
DATI ENDS

CODICE SEGMENT PARA
main proc far
ASSUME CS:CODICE, DS:DATI, SS:STACK
MOV AX, DATI
MOV DS, AX
mov ah,0fh
int 10h
mov ah,00h
int 10h
; **************

; **************

xor si,si
MOV AX, 0
MOV CX, 03
CICLO: MOV AL, VETT[si] ;metti in AL il si elemento di VETT
DIV DUE ;dividi per 2
CMP DX, 00H ;confronta il resto con 0
JE PARI ;se il resto =0 vai a PARI
JA dispar ;se il resto è >0 vai a DISPARI
PARI: INC TOT ;se il numero è pari, incrementa TOT
jmp increm
dispar: add dl,al


increm: inc si
LOOP CICLO ;fine del ciclo
mov dis,dl
MOV BL, TOT ;metti il risultato in BL
CALL scrivi ;chiama SCRIVI
MOV ASCII_T, BH ;metti la stinga in ASCII_T
; **************
; **************
LEA DX, TESTO
MOV AH, 09H
INT 21H
LEA DX, ASCII_T
MOV AH, 02H
INT 21H
mov ah,4ch
int 21h
MAIN ENDP
scrivi proc near
; Subroutine che converte un byte in due caratteri ASCII
; input in BL - Out in BX
push dx
mov bh,0
push bx
and bx,0fh
add bx,offset numeri
mov dl,[bx]
pop bx
and bx,0f0h
mov cl,4
shr bx,cl
add bx,offset numeri
mov dh,[bx]
mov bx,dx
pop dx
ret
scrivi endp
CODICE ENDS
END MAIN
sgorry84 Inserito il - 10/02/2004 : 19:50:39
ecco ho provato ha correggerlo... il programma somma i dispari e conta i pari.. il problema non sta nel risultato, ma nel fatto che mi compare una schermata nera e basta!

STACK SEGMENT PARA STACK
DB 64 DUP ('HYSTACK')
STACK ENDS

LF EQU 0DH
CR EQU 0AH
FINE EQU '$'

DATI SEGMENT PARA
TESTO DB 'IL TOTALE DI NUMERI PARI è ', LF, CR, FINE
TESTO2 DB 'LA SOMMA DEI NUMERI DISPARI è ', LF, CR, FINE
VETT DB 050H, 0A8H, 040H
DUE DB 02H
DIS DB 0
TOT DB 0
NUMERI DB '0123456789ABCDEF'
ASCII_T DB ?
ASCII_D DB ?
DATI ENDS

CODICE SEGMENT PARA
ASSUME CS:CODICE, DS:DATI, SS:STACK
MAIN PROC FAR
MOV AH, 0FH ;read the video mode
INT 10H
MOV AH, 0 ;set the video mode
INT 10H
MOV AX, DATI
MOV DS, AX
; **************

; **************
LEA BX, VETT
MOV AX, 0
MOV CX, 03
CICLO: MOV AL, VETT[BX] ;metti in AL il BX° elemento di VETT
DIV DUE ;dividi per 2
CMP DX, 00H ;confronta il resto con 0
JE PARI ;se il resto =0 vai a PARI
JA DISPARI ;se il resto è >0 vai a DISPARI
PARI: INC TOT ;se il numero è pari, incrementa TOT
DISPARI: ADD DIS, AL ;se il numero è dispari, somma il numero a DIS
ADD BX, 01H ;referenzia l'elemento successivo
LOOP CICLO ;fine del ciclo
MOV BL, TOT ;metti il risultato in BL
CALL SCRIVI ;chiama SCRIVI
MOV ASCII_T, BH ;metti la stinga in ASCII_T
MOV BL, DIS ;metti DIS in BL
CALL SCRIVI ;chiama SCRIVI
MOV ASCII_D, BH ;metti la stringa in ASCII_D
; **************
scrivi proc near
; Subroutine che converte un byte in due caratteri ASCII
; input in BL - Out in BX
push dx
mov bh,0
push bx
and bx,0fh
add bx,offset numeri
mov dl,[bx]
pop bx
and bx,0f0h
mov cl,4
shr bx,cl
add bx,offset numeri
mov dh,[bx]
mov bx,dx
pop dx
ret
scrivi endp
; **************
LEA BX, TESTO
MOV AH, 09
INT 21H
LEA BX, ASCII_T
MOV AH, 09
INT 21H
LEA BX, TESTO2
MOV AH, 09
INT 21H
LEA BX, ASCII_D
MOV AH, 09
INT 21H
MOV AH, 4CH
MOV AH, 4CH
RET
; ****
MAIN ENDP
CODICE ENDS
END MAIN
valenzanocity Inserito il - 10/02/2004 : 19:08:14
Esattamente che doveva fare il programma?Cmq dando una prima occhiata ho notato un errore quando incrementi i contatori pari e dispari, xchè se il numero è pari li incrementa entrambi.

Forum by laureateci.it © 2002 - 2012 Laureateci Communications Torna all'inizio della Pagina
Il DB ha risposto in 0,09 secondi.

TargatoNA.it | SuperDeejay.Net | Antidoto.org | Brutto.it | Equiweb.it | Snitz Forum 2000