| 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. |
|
|