Calculate two hexadecimal numbers |
;===================================================================== STACK SEGMENT PARA STACK DB 64 DUP ('STACK') STACK ENDS ;===================================================================== ;===SEGMENTO DE DADOS DATA SEGMENT PARA 'DATA' NUM1 DW ? NUM2 DW ? STR1 DB 'Introduza operando_1 (hex): ','$' ; mensagem de introduÁao do primeiro numero STR2 DB 0Ah,0Dh,'Introduza operando_2 (hex): ','$' ; mensagem de introduÁao do segundo numero RESULT DB 0Ah,0Ah,0Ah,0Dh,'Resultado da Soma (hex): ','$' ;iniciaÁ„o da mensagem do resultado carry DB '1','$' RES DW ? DATA ENDS ;===================================================================== ;===Segmento de Codigo CODE SEGMENT PARA 'C0DE' ;===Main do programa MAIN PROC FAR ASSUME CS:CODE, DS:DATA, ES:DATA, SS:STACK PUSH DS ;guarda na pilha o seg. ds SUB AX,AX ;garante zero no ax PUSH AX ;guarda zero na pilha MOV AX,DATA ;coloca em ax a posiÁao dos dados MOV DS,AX ;coloca essa posiÁao no registo ds LEA DX,STR1 CALL WRITE CALL ASCII2HEX MOV NUM1,AX LEA DX, STR2 CALL WRITE CALL ASCII2HEX MOV NUM2, AX LEA DX, RESULT CALL WRITE ;===================================================================== ;===AdiÁao de numeros SUB BX,BX MOV AX,NUM1 ADD AX,NUM2 JNC cont MOV RES, AX lea dx, carry MOV AH,09 INT 21H cont: MOV AX,res CALL HEX2ASCII RET MAIN ENDP ;===================================================================== ;===PROCEDIMENTO HEX2ASCII HEX2ASCII PROC PUSH CX ;salva cx na pilha PUSH DX ;salva dx na pilha MOV CL,4 ;abre contagem rotate MOV CH,4 ;abre contagem digito DISPH1: ROL AX,CL ;posicao do numero PUSH AX ;salva na pilha ax AND AL,0FH ;recebe digito hexadecimal ADD AL,30H ;ajusta-o para converter CMP AL,'9' ;compara com o '9' JBE DISPH2 ;salta para disph2 se entre nr 0 e 9 ADD AL,7 ;ajusta-o DISPH2: MOV AH,6 MOV DL,AL INT 21H ;manda o digito para o ecra POP AX ;tira da pilha para o ax para o restaurar DEC CH JNZ DISPH1 ;repete POP DX ;tira da pilha para restaurar dx POP CX ;tira da pilha para restaurar cx RET HEX2ASCII ENDP ;===================================================================== ;===Procedimento write WRITE PROC MOV AH,09 INT 21H RET WRITE ENDP ;===================================================================== ;===Convers„o procedimento CONV PROC CMP AL,'9' JBE CNUM ;se for numero CMP AL,'A' JB CLETRA ;se for letra CLETRA: SUB AL,7 CNUM: SUB AL,30H RET CONV ENDP ;===================================================================== ;===Procedimento ASCII2HEX ASCII2HEX PROC PUSH CX PUSH BX MOV CX,4 ;abre contagem para shift MOV SI,CX ;abre contagem XOR BX,BX ;limpa resultado READH1: MOV AH,6 ;le tecla MOV DL, 0FFH INT 21H JE READH1 ;espera pela tecla MOV DL,AL ;echo INT 21H CALL CONV ;converte para hexadecimal SHL BX,CL ;shift resultado ADD BL, AL ;adiciona al ao resultado DEC SI JNZ READH1 ; repete 4 vezes MOV AX,BX POP BX ;tira da pilha para restaurar bx POP CX ;tira da pilha para restaurar cx RET ASCII2HEX ENDP CODE ENDS END |
Showing posts with label Assembly. Show all posts
Showing posts with label Assembly. Show all posts
Soma de dois numeros hexadecimais
Desenha um quadrado apartir de coordenadas de um ficheiro
Draw a square from the coordenates from a file |
STACK SEGMENT PARA STACK DB 64 DUP ('mystack') STACK ENDS MYDATA SEGMENT PARA 'DATA' FILENAM DB '.\coord.txt',0 FHAND DW ? NAMEFLD DB 1 DUP (' '),'$' linha1 db 16 dup (' '), '$' linha2 db 16 dup (' '), '$' linha3 db 16 dup (' '), '$' linha4 db 16 dup (' '), '$' x1 dw 3 x2 dw 3 x3 dw 3 x4 dw 3 y1 dw 3 y2 dw 3 y3 dw 3 y4 dw 3 modo1 db 1 dup(' ') modo2 db 1 dup(' ') modo3 db 1 dup(' ') modo4 db 1 dup(' ') deslocamento1 db 1 dup(' ') deslocamento2 db 1 dup(' ') deslocamento3 db 1 dup(' ') deslocamento4 db 1 dup(' ') comprimento1 dw 3 comprimento2 dw 3 comprimento3 dw 3 comprimento4 dw 3 x dw 3 y dw 3 modo db 1 dup(' ') deslocamento dw 3 comprimento dw 3 enters db ? MYDATA ENDS MYCODE SEGMENT PARA 'CODE' MYPROC PROC FAR ASSUME CS:MYCODE,DS:MYDATA,SS:STACK PUSH DS SUB AX,AX PUSH AX MOV AX,MYDATA MOV DS,AX MOV ES,AX call open call readfirstlines call closefil lea si, linha1 call dividelinha mov ax, x mov x1,ax sub ax,ax mov ax, y mov y1,ax sub ax,ax mov al, modo mov modo1,al sub ax,ax mov ax, comprimento mov comprimento1,ax sub ax,ax mov ax, deslocamento mov deslocamento1,al sub ax,ax lea si, linha1 call dividelinha mov ax, x mov x2,ax sub ax,ax mov ax, y mov y2,ax sub ax,ax mov al, modo mov modo2,al sub ax,ax mov ax, comprimento mov comprimento2,ax sub ax,ax mov ax, deslocamento mov deslocamento2,al sub ax,ax lea si, linha3 call dividelinha mov ax, x mov x3,ax sub ax,ax mov ax, y mov y3,ax sub ax,ax mov al, modo mov modo3,al sub ax,ax mov ax, comprimento mov comprimento3,ax sub ax,ax mov ax, deslocamento mov deslocamento3,al sub ax,ax lea si, linha4 call dividelinha mov ax, x mov x4,ax sub ax,ax mov ax, y mov y4,ax sub ax,ax mov al, modo mov modo4,al sub ax,ax mov ax, comprimento mov comprimento4,ax sub ax,ax mov ax, deslocamento mov deslocamento4,al sub ax,ax sub bx,bx sub cx,cx mov cx, x1 mov dx, y1 mov bx, comprimento1 mov al, deslocamento1 cbw push ax push bx push cx push dx cmp modo1, 2dh je drawReverse1 call drawLine lp1: mov cx, x2 mov dx, y2 mov bx, comprimento2 mov al, deslocamento2 cbw push ax push bx push cx push dx cmp modo2, 2dh je drawReverse2 call drawLine lp2: mov cx, x3 mov dx, y3 mov bx, comprimento3 mov al, deslocamento3 cbw push ax push bx push cx push dx cmp modo3, 2dh je drawReverse3 call drawLine lp3: mov cx, x2 mov dx, y2 mov bx, comprimento3 mov al, deslocamento3 cbw push ax push bx push cx push dx cmp modo3, 2dh je drawReverse4 call drawLine drawReverse1: call drawReverseLine jmp lp1 drawReverse2: call drawReverseLine jmp lp2 drawReverse3: call drawReverseLine jmp lp3 drawReverse4: call drawReverseLine MYPROC ENDP OPEN proc near mov ah, 3dh ;par‚metro de abertura mov al, 0 ;Abre para leitura lea dx, FILENAM ;Nome do ficheiro a abrir int 21h ;abre mov FHAND, ax ret OPEN endp READFIRSTLINES PROC NEAR LP: mov ah,3fh ;par‚metro de leitura lea dx, NAMEFLD ;carrega em dx o endereÁo do que est a ser lido mov cx, 1 ;para ler 1 bytes mov bx, FHAND ;posiÁ„o onde estamos no ficheiro int 21h ;invoca a interrupÁ„o 21h do dos cmp ax, cx ;vÍ se È o fim do ficheiro,pois em ax est o que falta ler jne EOF cmp NAMEFLD,0ah ;ve se È enter je INCLINE ;se for incrementa cmp enters, 0 je Saveline1 cmp enters, 1 je Saveline2 cmp enters, 2 je Saveline3 cmp enters, 3 je Saveline4 jmp lp SAVELINE1: mov al, namefld ;move para al o byte que esta a ser lido cbw mov x1[si], ax ;move para coordenadas o que esta em al inc si ;incrementa o index jmp LP ;lÍ o proximo byte SAVELINE2: mov al, namefld ;move para al o byte que esta a ser lido mov linha2[si], al ;move para coordenadas o que esta em al inc si ;incrementa o index jmp LP ;lÍ o proximo byte SAVELINE3: mov al, namefld ;move para al o byte que esta a ser lido mov linha3[si], al ;move para coordenadas o que esta em al inc si ;incrementa o index jmp LP ;lÍ o proximo byte SAVELINE4: mov al, namefld ;move para al o byte que esta a ser lido mov linha4[si], al ;move para coordenadas o que esta em al inc si ;incrementa o index jmp LP ;lÍ o proximo byte INCLINE: inc enters ;incrementa o n?mero de enters sub si,si jmp LP EOF: RET READFIRSTLINES ENDP CLOSEFIL PROC near PUSH AX PUSH BX MOV AH,3EH ;flag para fechar o ficheiro MOV BX,FHAND INT 21H POP BX POP AX RET CLOSEFIL ENDP divideLinha proc near lea dx, linha1 mov ah,09 int 21h lea si, linha1 push bx push cx sub si,si ;coloca si a zero sub ax,ax ;coloca ax a zero add si, 3h ;limpa o lixo existente em si guardaX: mov cx,10 ;coloca 10 em cx para a multiplicaÁ„o sub bx,bx sub ax,ax leX: mov al, [si] ;move para al o caracter da string coordenadas correspondente ao index si inc si cmp al, 2ch ;verifica se È um espaÁo je lex cmp al,'0' ;verifica se È n?mero jb lex cmp al, '9' ;verifica se È n?mero ja lex sub al, 30h ;subtrai a al 30, para converter o numero push ax mov ax,bx mul cx ;multiplica ax por cx mov bx,ax pop ax xor ah,ah add bx,ax inc si ;incrementa o index jmp leX acabaX: mov ax,bx inc si mov x,ax ;Move para largura o valor de ax sub ax,ax jmp fim ;salta para a label guardaLargura guardaY: mov cx,10 sub bx,bx sub ax,ax leY: mov al, [si] ;move para al o caracter da string coordenadas correspondente ao index si cmp al, 2ch ;verifica se È um espaÁo je acabaY cmp al,'0' ;verifica se È numero jb acabaY cmp al, '9' ;verifica se È numero ja acabaY sub al, 30h ;subtrai a al 30, para converter o numero push ax mov ax,bx mul cx ;multiplica por cx mov bx,ax pop ax sub ah,ah add bx,ax inc si ;incrementa o index jmp leY acabaY: mov ax,bx inc si mov y,ax sub ax,ax jmp guardacomp ;salta para guardaAltura guardacomp: mov cx,10 ;coloca 10 em cx para a multiplicaÁ„o sub bx,bx sub ax,ax lecomp: mov al, [si] ;move para al o caracter da string coordenadas correspondente ao index si cmp al,2dh je guardamodo cmp al, 2ch ;verifica se È um espaÁo je acabacomp cmp al,'0' ;verifica se È n?mero jb acabacomp cmp al, '9' ;verifica se È n?mero ja acabacomp sub al, 30h ;subtrai a al 30, para converter o numero push ax mov ax,bx mul cx ;multiplica ax por cx mov bx,ax pop ax xor ah,ah add bx,ax inc si ;incrementa o index jmp leX acabacomp: mov ax,bx inc si mov x,ax ;Move para largura o valor de ax sub ax,ax jmp guardadesl guardadesl: mov al,[si] cbw mov deslocamento, ax jmp fim guardamodo: mov modo,al inc si jmp lecomp fim: ; Coloca na altura o valor de ax mov x,ax pop cx pop bx ret ;acaba o procedimento divideLinha endp CORES PROC NEAR mov ah,0Fh ; function 0Fh - get current mode int 10h ; Bios video service call MOV AH, 00h ; prepara para definir o modo graf. MOV AL, 13h ; modo graf. de 256 cores 320x200 color mode INT 10h ; invoca a interrupÁ„o 10h da BIOS MOV AH,11 ; prepara configuraÁ„o da palete de core MOV BH,00 ; inicializa a cor de background MOV BL,01 ; background azul INT 10h ; invoca a interrupÁ„o 10h da BIOS MOV AH,00 ; prepara configuraÁ„o da palete de cores MOV BH,01 ; prepara configuraÁ„o do foreground MOV BL,00 ; verde, vermelho e amarelo INT 10h ; invoca a interrupÁ„o 10h da BIOS ret CORES ENDP drawReverseLine proc near pop dx pop cx pop bx pop ax sub si,si cmp ax, 76h ;compara com v(ertical) je coluna linha: MOV AL,02 MOV AH,12 ;configura INT10h para plot do pixel INT 10h ;invoca a interrupÁ„o 10h da BIOS (desenha ponto) dec cx ;incrementa coluna inc si mov comprimento, bx CMP si,comprimento -1 ;linha feita ? JLE linha ;se n„o for lÍ o proximo byte ;para desenhar a proxima linha coluna: MOV AL,02 MOV AH,12 ;configura INT10h para plot do pixel INT 10h ;invoca a interrupÁ„o 10h da BIOS (desenha ponto) dec cx ;incrementa coluna inc si mov comprimento, bx CMP si,comprimento -1 ;linha feita ? JLE coluna ;se n„o for lÍ o proximo byte ret drawReverseLine ENDP drawLine proc near pop dx pop cx pop bx pop ax sub si,si cmp ax, 76h ;compara com v(ertical) je coluna linhad: MOV AL,02 MOV AH,12 ;configura INT10h para plot do pixel INT 10h ;invoca a interrupÁ„o 10h da BIOS (desenha ponto) inc cx ;incrementa coluna inc si mov comprimento, bx CMP si,comprimento -1 ;linha feita ? JLE linhad ;se n„o for lÍ o proximo byte ;para desenhar a proxima linha colunad: MOV AL,02 MOV AH,12 ;configura INT10h para plot do pixel INT 10h ;invoca a interrupÁ„o 10h da BIOS (desenha ponto) inc dx ;incrementa linha inc si mov comprimento, bx CMP si,comprimento -1 CMP si,bx ;linha feita ? JLE colunad ;se n„o for lÍ o proximo byte ret drawLine ENDP MYCODE ENDS end |
Paint
;PAINT |
;PAINT .286 ;-------------------------------------------------------------------------------------------------------------------------------- ; Macros ;-------------------------------------------------------------------------------------------------------------------------------- GetGM macro ; Guarda o mode gr fica actual (Get Graphic Mode) mov ah, 0fh ; verifica o modo gr fico actual int 10h ; invoca a interrupÁ„o 10h da BIOS push ax ; guarda o modo gr fico actual (ah - n de colunas, al - modo gr fico) endm RstGM macro ; Restaura o modo gr fico guardade (Restore Graphic Mode) pop ax ; volta ao modo gr fico anterior mov ah, 00h ; prepara para definir o modo gr fico int 10h ; invoca a interrupÁ„o 10h da BIOS endm SetGM macro ; inicia modo gr fico pusha mov ah, 00h ; selecciona o modo gr fico mov al, 13h ; configura o modo 19 (ou 13h) 320x200 com 256 cores int 10h ; invoca a interrupÁ„o do modo gr fico mov ax, 0a000h ; indica o edereÁo de memÛria onde comeÁa a memÛria gr fica mov es, ax ; coloca o endereÁo em "es" cld ; activa a auto incrementaÁ„o de "SI" e "DI" apÛs uma leitura ou escrita na memÛria popa endm StartMouse macro pusha mov ax, 00h ; inicia o rato int 33h ; invoca a interrupÁ„o do rato popa endm ShowMouse macro pusha mov ax, 01h ; mostra o cursor do rato int 33h ; invoca a interrupÁ„o do rato popa endm HideMouse macro pusha mov ax, 02h ; esconde o ponteiro do rato int 33h ; invoca a interrupÁ„o do rato popa endm createfil macro mov ah, 3ch mov cx, 00h lea dx, instring add dx, 2 int 21h endm openreadfil macro mov al, 00h mov ah, 3dh lea dx, instring add dx, 2 int 21h mov fhand, ax endm openwritefil macro mov al, 01h mov ah, 3dh lea dx, instring add dx, 2 int 21h mov fhand, ax endm indexnum macro mov al, 02 mov ah, 42h mov bx, fhand mov cx, 00h mov dx, 00h int 21h endm writefil macro mov ah, 40h mov bx, fhand int 21h endm readfil macro pusha mov ah, 3fh mov bx, fhand mov cx, 1 lea dx, byteread int 21h popa endm readimgfil macro pusha mov ah, 3fh mov bx, fhand mov cx, 64000 lea dx, storeBuff int 21h popa endm closefil macro mov ah, 3eh mov bx, fhand int 21h endm ;-------------------------------------------------------------------------------------------------------------------------------- ;Stack Segment ;-------------------------------------------------------------------------------------------------------------------------------- Stack Segment Para Stack db 64 dup('Stack ') Stack Ends ;-------------------------------------------------------------------------------------------------------------------------------- ;Data Segment ;-------------------------------------------------------------------------------------------------------------------------------- Data Segment Para 'Data' posX dw ? ; coordenada x da posiÁ„o actual do ponteiro posY dw ? ; coordenada y da posiÁ„o actual do ponteiro selXbeg dw ? ; coordenada x do canto superior esquerdo da selecÁ„o selYbeg dw ? ; coordenada y do canto superior esquerdo da selecÁ„o selXend dw ? ; coordenada x do canto inferior direito da selecÁ„o selYend dw ? ; coordenada y do canto inferior direito da selecÁ„o horLeng dw ? ; selXend - selXbeg horLengOld dw ? ; guarda o valor anterior de horLeng quando copia verLeng dw ? ; selYend - selYbeg verLengOld dw ? ; guarda o valor anterior de verLeng quando copia horStop dw ? ; posX + horLeng (ponto de paragem do Paste) verStop dw ? ; posY + verLeng (ponto de paragem do Paste) storeBuff db 64000 DUP (' ') currColor db 0fh ; guarda o valor da cor actual, iniciado a 0fh (branco) fhand dw ? endlin db 0ah,0dh,'$' prompt db 'Localizacao do ficheiro (20 BYTES MAX): ','$' instring db 21,21 dup (' '),'$$',0 header db 'P5',10 db 'Ficheiro Gerado Por Pinta V1.0 Autores: Diogo Silva e LuÌs Mendes',10 db '300 200',10 db '255',10 imgsizevert dw ? imgsizehor dw ? byteread db ? Data Ends ;-------------------------------------------------------------------------------------------------------------------------------- ;Code Segment ;-------------------------------------------------------------------------------------------------------------------------------- Code Segment Para 'Code' ;================================================ ; Main Main proc far assume cs:Code, ds:Data, es:Data, ss:Stack push ds ; guarda o endereÁo de ds na pilha sub ax, ax ; coloca o ax a 0 push ax ; coloca o valor de ax na pilha mov ax, data ; copia o endereÁo de data segment para ax mov ds, ax ; copia o endereÁo de ax para o registo ds GetGM ; guarda o modo gr fico actual SetGM ; inicia o modo gr fico 320x200 a 256 cores StartMouse ; chama a rotina para iniciar o rato call DrawPallet ; desenha a palete no ecran call ShowCurrCol ; desenha uma area que mostra a cor escolhida ifNotKeyPressed: call CheckMouse ; chama a rotina que verifica o estado do rato cmp bl, 01h ; verifica se o bot„o esquerdo do rato foi pressionado (0001 em bin rio) jb dontDraw ; se n„o foi pressionado n„o desenha o pixel cmp bl, 02h ; verifica se o bot„o direito do rato foi pressionado (0010 em bin rio) jne contDraw ; Desenha o px call SelectArea ; chama a rotina que selecciona uma area a copiar jmp dontDraw ; n„o desenha contDraw: call Draw ; chama a rotina que desenha o pixel dontDraw: mov ah, 01h ; verifica se alguma tecla foi pressionada int 16h ; chama a interrupÁ„o de chamada ao sistema operativo jz ifNotKeyPressed mov ah, 00h ; uma tecla foi pressionada int 16h ; È necess rio captura-la para n„o aparecer na consola cmp al, 1bh ; verifica se a tecla pressionada È "Esc" (ASCII - 1Bh). je theEnd ; se n„o È continua o programa normalmente cmp al, 'c' jne nCopyArea call CopyArea nCopyArea: cmp al, 'p' jne Clear call PasteArea Clear: cmp al, 'd' jne Ofile call Refresh Ofile: cmp al,'o' jne Sfile call img call fich closefil Sfile: cmp al, 's' jne ifNotKeyPressed call img2 ;call fich createfil openwritefil indexnum call wdata closefil call Refresh jmp ifNotKeyPressed theEnd: RstGM ; Restaura o modo gr fico guardado no inicio do programa ret ; sai do programa Main endp ;================================================ ; converte de ascii para bin convert proc push ax mov cx, 10 mov ax, bx mul cx mov bx, ax pop ax mov ah, 0h sub al, 30h add bx, ax ret convert endp ;================================================ ; pede o nome do ficheiro ao utilizador e abre-o img proc xor bx, bx mov ah, 0h mov al, 03h int 10h mov ah, 09 lea dx, prompt int 21h mov ah, 0ah lea dx, instring int 21h mov ah, 09 lea dx, endlin int 21h mov al, instring + 1 add al, 2 cbw ; converte al, em word ax al -> ax mov bx, ax mov instring[bx], ' ' mov ah, 09 ; lea dx, instring ; add dx, 2 ; avanÁa dois bytes (bytesmax, byteslidos) int 21h mov ah, 09 lea dx, endlin int 21h ret img endp img2 proc mov selXbeg,20 mov selYbeg,0 mov selXend,320 mov selYend,200 call CopyArea xor bx, bx mov ah, 0h mov al, 03h int 10h mov ah, 09 lea dx, prompt int 21h mov ah, 0ah lea dx, instring int 21h mov ah, 09 lea dx, endlin int 21h mov al, instring + 1 add al, 2 cbw ; converte al, em word ax al -> ax mov bx, ax mov instring[bx], ' ' mov ah, 09 ; lea dx, instring ; add dx, 2 ; avanÁa dois bytes (bytesmax, byteslidos) int 21h mov ah, 09 lea dx, endlin int 21h ret img2 endp fich proc call Refresh openreadfil jc DontExist mov fhand, ax call rdata DontExist: ret fich endp rdata proc mov cx,2 lf: readfil mov al, byteread cmp al, 0ah jne lf loop lf xor bx, bx outro: readfil mov al, byteread cmp al, 20h ; 20h = espaÁo je guarda1 cmp al, 0ah ; 0ah = LF je guarda2 call convert jmp outro guarda1: mov imgsizehor, bx xor bx, bx jmp outro guarda2: mov imgsizevert, bx lf1: readfil mov al, byteread cmp al, 0ah jne lf1 readimgfil mov ax, imgsizevert mov verLengOld, ax mov ax, imgsizehor mov horLengOld, ax mov selXbeg, 20 mov posX,20 mov posY,0 call PasteArea ret rdata endp wdata proc mov cx, 81 lea dx, header writefil mov cx,60000 lea dx,storeBuff writefil ret wdata endp ;================================================ ; verifica estado do rato CheckMouse proc mov ax, 03h ; funÁ„o que retorna informaÁ„o do rato int 33h ; invoca a interrupÁ„o do rato mov posX, cx ; guarda a posiÁ„o horizontal do rato shr posX, 1 ; È necess rio fazer uma divis„o por dois pois a tela virtual do rato tem 640 pontos horizontais e o ecr„ tem 320 mov posY, dx ; guarda a posiÁ„o vertical do rato cmp bl, 00h ; verifica se est algum bot„o pressionado jne return ; se estiver n„o coloca o cursor visivel ShowMouse ; mostra o cursor do rato return: ret CheckMouse endp ;================================================ ; pinta no ecran Draw proc mov cx, posX ; selecciona a coluna cmp cx, 20 ; verifica se o rato se encontra ‡ esquerda do pixel 20 (palete) jae PutPixel ; caso se encontre ‡ direita desenha call ChooseColor ; caso se encontre ‡ esquerda chama a rotina que escolhe a cor da palete jmp nPutPixel PutPixel: HideMouse mov si, posY mov ax, 320 mul si mov di, ax add di, cx mov al, currColor stosb nPutPixel: ret Draw endp ;================================================ ; desenha no lado esquerdo do ecran uma palete de cores DrawPalletLine proc pusha mov ah, 12 xor bx, bx xor cx, cx PutDot1: int 10h inc cx cmp cx, 5 jb PutDot1 cmp al, 10h jb PutDot2 add al, 60 PutDot2: int 10h inc cx cmp cx, 10 jb PutDot2 cmp al, 10h jb PutDot3 add al, 60 PutDot3: int 10h inc cx cmp cx, 15 jb PutDot3 cmp al, 10h jb PutDot4 add al, 60 PutDot4: int 10h inc cx cmp cx, 20 jb PutDot4 popa ret DrawPalletLine endp ;================================================ DrawPallet proc pusha xor ax, ax xor dx, dx mov cx, 76 PutLines: call DrawPalletLine inc dx call DrawPalletLine inc dx inc ax loop PutLines popa ret DrawPallet endp ;================================================ ; Mostra um quadrado com a cor currente ShowCurrCol proc pusha mov dx, 152 ; linha de comeÁo NextLine: mov si, dx ; linha (dx) mov ax, 320 push dx mul si pop dx mov di, ax mov al, currColor mov cx, 20 rep stosb inc dx cmp dx, 200 ; compara com a linha final jb NextLine popa ret ShowCurrCol endp ;================================================ ; Selecciona a cor da palete ChooseColor proc pusha HideMouse mov si, posY mov ax, 320 mul si mov di, ax add di, posX mov al, es:[di] mov currColor, al call ShowCurrCol popa ret ChooseColor endp ;================================================ ; Selecciona uma zona do ecran SelectArea proc mov ax, posX mov selXbeg, ax mov ax, posY mov selYbeg, ax select: mov ax, 03h int 33h mov selXend, cx shr selXend,1 mov selYend, dx cmp bx, 02h je select CompHor: mov ax, selXbeg mov bx, selXend cmp ax, bx jb CompVer mov selXbeg, bx mov selXend, ax CompVer: mov ax, selYbeg mov bx, selYend cmp ax, bx jb CalcDim mov selYbeg, bx mov selYend, ax CalcDim: mov ax, selXend sub ax, selXbeg mov horLeng, ax mov ax, selYend sub ax, selYbeg mov verLeng, ax ret SelectArea endp ;================================================ ; copia a ultima area seleccionada CopyArea proc mov ax, horLeng mov horLengOld, ax mov ax, verLeng mov verLengOld, ax HideMouse ; esconde o ponteiro do rato xor bx, bx mov dx, selYbeg rep1: mov cx, selXbeg rep2: xor ax, ax push bx mov ah, 13 mov bh, 00h int 10h pop bx mov storeBuff[bx], al inc bx inc cx cmp cx, selXend jb rep2 inc dx cmp dx, selYend jb rep1 ShowMouse ; mostra o ponteiro do rato ret CopyArea endp ;================================================ ; cola na posiÁ„o actual a area guardada PasteArea proc mov cx, posX ; selecciona a coluna para comparar cmp cx, 20 ; verifica se o rato se encontra ‡ esquerda do pixel 20 (palete) jb DontPaste ; caso se encontre ‡ esquerda n„o cola mov cx, selXbeg ; selecciona a coluna de inicio da selecÁ„o cmp cx, 20 ; verifica se a selecÁ„o n„o foi feita ‡ esquerda do pixel 20, ou seja, impede a copia da palete jb DontPaste ; caso se encontre ‡ esquerda n„o cola HideMouse ; esconde o ponteiro do rato xor bx, bx mov ax, posY add ax, verLengOld mov verStop, ax mov ax, posX add ax, horLengOld mov horStop, ax mov dx, posY rep3: mov cx, posX rep4: mov al, storeBuff[bx] cmp al, 00h je DontPutDot cmp cx, 320 jae DontPutDot cmp dx, 200 jae DontPutDot push bx mov ah, 12 mov bh, 00h int 10h pop bx DontPutDot: inc bx inc cx cmp cx, horStop jb rep4 inc dx cmp dx, verStop jb rep3 ShowMouse ; mostra o ponteiro do rato DontPaste: ret PasteArea endp ;================================================ ; cola na posiÁ„o actual a area guardada Refresh proc pusha SetGM call DrawPallet ; desenha a palete no ecran call ShowCurrCol popa ret Refresh endp ;================================================ Code Ends ;================================================ End ;-------------------------------------------------------------------------------------------------------------------------------- |
Carrega uma imagem
This is a example to show a image, its not a puzzle because isn't complete :p |
;-------------------------------------------------------------------------------------------------------------- ;Puzzle ;-------------------------------------------------------------------------------------------------------------- ;-------------------------------------------------------------------------------------------------------------- STACK SEGMENT PARA STACK DB 64 DUP ('mystack') STACK ENDS ;-------------------------------------------------------------------------------------------------------------- MYDATA SEGMENT PARA 'DATA' ;--------------------------Open file-------------------------- NAMEPAR LABEL BYTE MAXLENB db 81 ACTLEN DB ? NAMEFLD DB 1 DUP (' '),'$' LineCord db 8 dup (' '), '$' ;guarda a linha FHAND DW ? ;--------------------------Largura e altura-------------------------- Height dw 3 ;guarda a largura Widht dw 3 ;guarda a altura ;--------------------------Imagem-------------------------- FILENAM DB '.\images\ping.pgm',0 ;--------------------------About-------------------------- About0 db " ___.-- PUZZLE --.___$",10 ;--------------------------Botoes-------------------------- btnPlay db 'Play' ,0 ,'$' btnAbout db 'About',0 ,'$' btnExit db 'Exit' ,0 ,'$' btnAboutOK db 'OK' ,0 ,'$' InfoClick db 0 ;--------------------------Coordenadas para label e border dos botoes-------------------------- x db ? y db ? x1 dw ? y1 dw ? x2 dw ? y2 dw ? MYDATA ENDS;-------------------------------------------------------------------------------------------------------------- MYCODE SEGMENT PARA 'CODE' MYPROC PROC FAR ASSUME CS:MYCODE,DS:MYDATA,SS:STACK ;--------------------------- Inicializações ----------------------------- PUSH DS SUB AX,AX PUSH AX MOV AX,MYDATA MOV DS,AX MOV ES,AX ;Codigo ;-------------------------------------------------------------------------------------------------------------- start: CALL OPENFIL ;abre o ficheiro e lê a 3º linha call SeparaCord ;separa as coordenadas call Graficos ;vai para o procedimento de inicializar os graficos call DrawImage ;vai para o procedimento DrawImage Mostrar imagem call DrawButtons ; vai par ao procedimento para desenhar os butoes CALL StartMouse ;vai para o procedimento para inicializa o rato CALL ShowMouse ;vai para o procedimento para mostrar o rato mov InfoClick, 0 ;inicializa Infoclick ;----------------------- Loop para verificações se clica no botao sair ou jogar ----------------------- LoopClick: CALL CheckClick ;Chama o procedimento CheckClick ;cmp InfoClick,1 ;compara infoclick com 1 ;je Play ;se for 1, vai para a label Play cmp InfoClick,2 ;compara infoclick com 2 je Exit ; se for 2, vai para a label Exit cmp InfoClick,3 ;compara infoclick com 3 je About ;se for 3 vai para a label about jmp LoopClick ;loop enquanto não se sair About: call ClearScreen ; Chama o procedimento Clearscreen call Graficos ;Chama o procedimento graficos call DrawAbout ; Chama o procedimento DrawAbout call AboutOkBTN ;Chama o procedimento AboutOkBTN CALL StartMouse ;Chama o procedimento StartMouse CALL ShowMouse ; Chama o procedimento ShowMouse loopAboutExit: Call CheckClick2 ;Chama o procedimento CheckClick2 Cmp InfoClick,4 ;Move 4 para a variavel Infoclick je Menu ; Salta para a label Menu, se for igual jmp loopAboutExit ;senão salta para a label loopAboutExit Menu: call ClearScreen ;Chama o procedimento ClearScreen jmp start ;Salta para a label start Exit: CALL CLOSEFIL ; Chama o procedimento Closefil call ReturnToGraphicMode ; Chama o procedimento ReturnToGraphicMode RET MYPROC ENDP ;-------------------------------------------------------------------------------------------------------------- ;Codigo para abrir o ficheiro ;-------------------------------------------------------------------------------------------------------------- OPENFIL PROC NEAR mov ah, 3dh ;Abre o ficheiro mov al, 0 ;Abre-o para ler lea dx, FILENAM ;Aponta em dx, o Filenam int 21h ;invoca a interrupção do 21h do dos mov FHAND, ax ;Move para ax, a posição, onde se encontra no ficheiro OPENFIL ENDP ;-------------------------------------------------------------------------------------------------------------- ;Codigo para ler o ficheiro e guargar a linha ;-------------------------------------------------------------------------------------------------------------- READFILE PROC NEAR sub di,di ;mete di a zero ReadByte: MOV ah,3fh ;Modo para ler dados de um ficheiro LEA dx, NAMEFLD ;endereço do namefld que tem o dado lido MOV cx, 1 ;le 1 bytes MOV bx, FHAND ;move para bx o valor do file handle INT 21h ;invoca a interrupção do 21h do dos cmp ax, cx ;chegou ao fim do ficheiro? jne EOF ; se sim vai para a label EOF cmp NAMEFLD,0AH ; compara namefld com 0ah (se é um enter ) je IncEnter ; se for igual salta para a label IncEnter cmp di, 2 ; ve se esta no enter 2 je ReadLine ;se for igual salta para o label ReadLine cmp di, 4 ; ve se esta no enter 4 je eof ;Se estiver salta para a label EOF JMP ReadByte ;Lê o proximo byte IncEnter: inc di ;incrementa o count jmp ReadByte ;salta para a label ReadByte ReadLine: mov al, namefld ;move para al, o byte que esta em namefld mov LineCord[si], al ;move para Linecord (na posição SI) o que esta em al inc si ;incrementar si jmp ReadByte ;Lê o proximo byte EOF: RET ; sai do procedimento READFILE endp ;-------------------------------------------------------------------------------------------------------------- ;Codigo para separar a linha nas variaveis ;-------------------------------------------------------------------------------------------------------------- SeparaCord proc near lea si, Linecord ;endereço do Linecord que tem a linha com alt e larg push bx ;vamos guardar bx na pilha push cx ;vamos guardar cx na pilha push ax ;vamos guardar ax na pilha sub si,si ;vamos por si a zero sub ax,ax ; vamos por ax a zero mov cl,4 ;movemos para cl 4 add si, 4 ;Adicionamos a si 4, para remover o lixo do inicio da string SaveWidht: mov dl, [SI] ;move para dl, o caracter da posiçao si, da string Linecord cmp dl, 20h ;verifica se é um espaço je incSpace ;se for salta para a label incSpace sub dl, 30h ; converte para um numero decimal SHL AX,cl ;faz um shift ao resultado ADD AL, DL ;adiciona al ao resultado inc si ;incrementa si jmp SaveWidht ;salta para a label SaveWidht Saveheight2: mov dl, [SI] ;move para dl, o caracter da posiçao si, da string Linecord cmp dl, 20h ;verifica se é um espaço je fim ;se for salta para a label incSpace sub dl, 30h ; converte para decimal SHL AX,cl ;shift resultado ADD AL, DL ;adiciona al ao resultado inc si ;incrementa si jmp SaveHeight2 ;salta para a label SaveHeight2 IncSpace: inc si ;para remover o space mov Widht,ax ;Move para Widht o valor de ax sub ax,ax ;Limpa ax jmp Saveheight2 ;salta para a label Saveheight2 fim: mov Height,ax ; Move para height o valor de ax pop ax ;Volta a carregar o valor de ax, que se encontra na plha pop cx ;Volta a carregar o valor de cx, que se encontra na plha pop bx ;Volta a carregar o valor de bx, que se encontra na plha ret ;acaba o procedimento SeparaCord endp ;-------------------------------------------------------------------------------------------------------------- ; ROTINA PARA CONFIGURAR MODO GRAFICO E CORES ;-------------------------------------------------------------------------------------------------------------- Graficos proc near mov ah,0Fh ; function 0Fh - get current mode int 10h ; Bios video service call MOV AH, 00h ; prepara para definir o modo graf. mov al, 13h ; modo 13h 256 cores 320*200 INT 10h ; invoca a interrupção 10h da BIOS MOV AH,11 ; prepara configuração da palete de core MOV BH,00 ; inicializa a cor de background MOV BL,26 ; background azul INT 10h ; invoca a interrupção 10h da BIOS MOV AH, 00 ; prepara configuração da palete de cores MOV BH,01 ; prepara configuração do foreground MOV BL,00 ; verde, vermelho e amarelo INT 10h ; invoca a interrupção 10h da BIOS ret ;sai do procedimento Graficos endp ;------------------------------------------------------------------------------------------------------ ; Rotina para desenhar a imagem ;-------------------------------------------------------------------------------------------------------------- DrawImage proc near sub dx,dx ;Necessário limpar para meter dx a zero, de forma a desenhar em (0,0), porque com o pop não funciona ReadAndDraw: push cx ;carrega na pilha o valor de cx push dx ;carrega na pilha o valor de dx MOV ah,3fh ;Modo para ler dados de um ficheiro LEA dx, NAMEFLD ;endereço do namefld que tem o dado lido MOV cx, 1 ;le 1 bytes MOV bx, FHAND ;move para bx o valor do file handle INT 21h ;invoca a interrupção do 21h do dos cmp ax, cx ;chegou ao fim do ficheiro? jne EOF2 ; se sim vai para a label EOF pop dx ;puxa o valor de dx pop cx ;puxa o valor de cx MOV AL,NAMEFLD ; mova para al, a cor lida call coresCertas ;Salta para o procedimento CoresCertas para corrigir a cor ;linha MOV AH,12 ; configura INT10h para plot do pixel INT 10h ; invoca a interrupção 10h da BIOS, Desenha o ponto INC cX ;incrementa coluna mov bx, 99 ;move para bx, 99 (Largura da imagem) CMP cx,bx ;linha feita ? JLE ReadAndDraw ;se não salta para a label ReadAndDraw ;coluna mov cx,0 ;Move para cx, 0 inc dX ;incrementa linha mov bx, 117 ;move para cx 117, (Altura da imagem) CMP dX,bx ;compara dx, bx JLE ReadAndDraw ;salta para a label ReadAndDraw eof2: ret ;sai do procedimento DrawImage endp ;-------------------------------------------------------------------------------------------------------------- ; Rotina para colocar as cores certas ;-------------------------------------------------------------------------------------------------------------- coresCertas proc near ; Nestre procedimento, irá entrar a cor al, e irá comparar com os certos limites ; para saber qual a cor que de seguida irá tomar cmp al, 0fh jbe cor16 cmp al, 01fh jbe cor17 cmp al, 02fh jbe cor18 cmp al, 03fh jbe cor19 cmp al, 04fh jbe cor20 cmp al, 05fh jbe cor21 cmp al, 06fh jbe cor22 cmp al, 07fh jbe cor23 cmp al, 08fh jbe cor24 cmp al, 09fh jbe cor25 cmp al, 0afh jbe cor26 cmp al, 0bfh jbe cor27 cmp al, 0cfh jbe cor28 cmp al, 0dfh jbe cor29 cmp al, 0efh jbe cor30 mov al, 1fh ret cor16: mov al, 10h ret cor17: mov al, 11h ret cor18: mov al, 12h ret cor19: mov al, 13h ret cor20: mov al, 14h ret cor21: mov al, 15h ret cor22: mov al, 16h ret cor23: mov al, 17h ret cor24: mov al, 18h ret cor25: mov al, 19h ret cor26: mov al, 1Ah ret cor27: mov al, 1bh ret cor28: mov al, 1ch ret cor29: mov al, 1dh ret cor30: mov al, 1eh ret coresCertas endp ;-------------------------------------------------------------------------------------------------------------- ; Rotina para inicializar o rato ;-------------------------------------------------------------------------------------------------------------- StartMouse proc near push ax ;mete para a pilha o valor de ax mov ax,00h ;Inicializa o driver do rato int 33h ;invoca a interrupção do 33h do dos pop ax ;puxa da pilha o valor de ax ret ;sai do procedimento StartMouse endp ;-------------------------------------------------------------------------------------------------------------- ; Rotina para mostrar o rato ;-------------------------------------------------------------------------------------------------------------- ShowMouse proc near push ax ;mete para a pilha o valor de ax mov ax,01h ;Activa o cursor do rato int 33h ;invoca a interrupção do 33h do dos pop ax ;Puxa da pilha o valor de ax ret ;sai do procedimento ShowMouse endp ;-------------------------------------------------------------------------------------------------------------- ; Rotina para desenhar os butoes ;-------------------------------------------------------------------------------------------------------------- DrawButtons proc near ;---------------- ;Botao Play | ;---------------- mov x1, 235 ;move para x1 o valor 235 mov x2, 281 ;move para x2 o valor 281 mov y1, 39 ;move para y1 o valor 39 mov y2, 54 ;move para y2 o valor 54 CALL btnBorder ;chama o procedimento btnBorder mov x, 150 ;move para x o valor 150 mov y, 5 ;move para y o valor 5 lea di,btnPlay ;endereço do btnPlay que tem o texto do botão CALL printLabelButtons ;chama o procedimento printLabelButtons ;---------------- ;Botao Exit | ;---------------- mov x1, 235 ;move para x1 o valor 235 mov x2, 281 ;move para x2 o valor 281 mov y1, 86 ;move para y1 o valor 86 mov y2, 102 ;move para y2 o valor 102 CALL btnBorder ;chama o procedimento btnBorder mov x, 150 ;move para x o valor 150 mov y, 11 ;move para y o valor 11 lea di,btnExit ;endereço do btnExit que tem o texto do botão CALL printLabelButtons ;Chama o procedimento printLabelButtons ;---------------- ;Botao About | ;---------------- mov x1, 235 ;move para x1 o valor 235 mov x2, 282 ;move para x2 o valor 282 mov y1, 134 ;move para y1 o valor 134 mov y2, 150 ; move para y2 o valor 150 CALL btnBorder ;chama o procedimento btnBorder mov x, 150 ;Move para x o valor 150 mov y, 17 ;move para y o valor 17 lea di,btnAbout ;endereço do btnAbout que tem o texto do botão CALL printLabelButtons ;chama o procedimento printLabelButtons ret ;sai do procedimento DrawButtons endp ;-------------------------------------------------------------------------------------------------------------------------- ; Rotina para desenhar o botão do about OK, ou seja para sair do about e voltar ao menu inicial ;-------------------------------------------------------------------------------------------------------------------------- AboutOkBTN proc near ;-------------------- ;Botao ABOUT | ;-------------------- mov x1, 235 ;move para x1 o valor 235 mov x2, 282 ;move para x2 o valor 282 mov y1, 86 ;move para y1 o valor 86 mov y2, 102 ;move para y2 o valor 102 CALL btnBorder ;chama o procedimento btnBorder mov x, 150 ;move para x o valor 150 mov y, 11 ;move para y o valor 11 lea di,btnAboutOK ;endreço do btnAboutOk que tem o texto do botão CALL printLabelButtons ;chama o procedimento printLabelButtons ret ;Sai do procedimento AboutOkBTN endp ;-------------------------------------------------------------------------------------------------------------- ; Rotina para desenhar a borda dos butoes ;-------------------------------------------------------------------------------------------------------------- btnBorder proc near MOV CX, x1 ; move para cx, o valor de x1 MOV DX, y1 ;move para dx o valor de y1 ;desenha metade da borda Linha: INC CX ;incrementa cx MOV AL,70h ;Mete na borda a cor vermelha MOV AH,12 ; configura INT10h para plot do pixel INT 10h ; invoca a interrupção 10h da BIOS CMP CX, x2 ;Compara se chegou ao fim JNE Linha ;se não volta para a label Linha Coluna: INC DX ;incrementa dx MOV AL,70h ;Mete na borda a cor vermelha MOV AH,12 ; configura INT10h para plot do pixel INT 10h ; invoca a interrupção 10h da BIOS CMP DX, y2 ;compara dx com y2, ou seja se chegou ao fim da coluna JNE Coluna ;se não volta para a coluna ;desenha a outra metade ;==================================================== Linha2: DEC CX ;Decrementa cx MOV AL,70h ;Mete na borda a cor vermelha MOV AH,12 ; configura INT10h para plot do pixel INT 10h ; invoca a interrupção 10h da BIOS CMP CX, x1 ;compara cx com x1, se chegou ao fim da linha2 JNE Linha2 ;se nao, volta para a linha2 Coluna2: DEC DX ;decrementa dx MOV AL,70h ;Mete na borda a cor vermelha MOV AH,12 ; configura INT10h para plot do pixel INT 10h ; invoca a interrupção 10h da BIOS CMP DX, y1 ;compara dx com y1, se chegou ao fim da coluna2 JNE Coluna2 ;se nao, volta para a coluna2 RET ; sai do procedimento btnBorder endp ;-------------------------------------------------------------------------------------------------------------- ; Rotina para por a label no botão ;-------------------------------------------------------------------------------------------------------------- printLabelButtons proc near push ax ;guarda na pilha o valor de ax push bx ;guarda na pilha o valor de bx push dx ;guarda na pilha o valor de dx MOV AH,2 ;move para ah o valor 2, de forma a mostrar correctamente no sitio as labels MOV BX,0 ;move para bx 0, de forma a mostrar a mudança de linha MOV DH,y ;move para dh o valor de y MOV DL,x ;move para dl o valor de x INT 10h ; invoca a interrupção 10h da BIOS LEA dx,byte ptr [di] ;guarda em dx o endereço de di, de forma a mostrar no ecra a label CALL PrtStr ;chama o procedimento PrtStr pop dx ;puxa o valor de dx da pilha pop bx ;puxa o valor de bx da pilha pop ax ;puxa o valor de ax da pilha ret ;sai do procedimento printLabelButtons endp ;-------------------------------------------------------------------------------------------------------------- ; Rotina para imprimir a label no ecra ;-------------------------------------------------------------------------------------------------------------- PrtStr proc near push ax ;guarda o valor de ax na pilha lea dx, byte ptr [di] ;guarda em dx o endereço de di, de forma a mostrar no ecra a label mov ah,9h ;display de strings, config int21h int 21h ;invoca a interrupção do 21h do dos pop ax ;puxa da pilha o valor de ax ret ;termina o procedimento PrtStr endp ;-------------------------------------------------------------------------------------------------------------- ; Rotina para imprimir a label no ecra ;-------------------------------------------------------------------------------------------------------------- CheckClick proc near push ax ;guarda na pilha o valor de ax push bx ;guarda na pilha o valor de bx push cx ;guarda na pilha o valor de cx push dx ;guarda na pilha o valor de dx ;-------------------vericações dos botõe do rato------------------ mov ax, 05h ;interrupçao do rato MOV BX,0 ;para verificar se o botão do lado esquerdo foi clicado int 33h ;invoca a iterrupção do 33h do dos AND AX,1b ; faz um and, para ver se o bit é 0 ou 1 cmp ax,1b ;verifica se o botão esquerdo do rato foi clicado je Clicked ;se sim salta para a label Clicked ;como não foi clicado entao sai pop dx ;puxa da pilha dx pop cx ;puxa da pilha cx pop bx ;puxa da pilha bx pop ax ;puxa da pilha ax RET ;termina o procedimento ;---------------------------------------------------------------------------- ;ver onde está a clicar Clicked: cmp cx, 468 ;compara cx com 468, que é as cordenadas do x do botao exit,play,about jae Quit2 ;Se sim salta para quit2 jmp noClicked ;senão vai para a label noClicked Quit2: cmp cx, 565 ;compara cx com 565 que é as coordenadas do x botao exit, play about jbe Quit3 ;se sim salta para a label quit3 jmp noClicked ;senao vai para a label noClicked Quit3: cmp dx, 86 ;compara dx com 86 que é as coordenadas do y do botao exit e about jae Quit4 ;se sim salta para quit4 cmp dx,39 ;compara dx com 39 que é coordenadas do y do botao play jae Play1 ;se sim salta para a label play1 jmp noClicked ;senão vai para a label noClicked Quit4: cmp dx, 102 ;compara dx com 102 que é as coordenadas do y do botao exit jbe QuitYes ;se sim salta para a label QuitYes cmp dx, 134 ;Compara dx com 134 que é as coordenadas do y do botao about jae Sobre1 ;se sim salta para a label sobre 1 jmp noClicked QuitYes: mov InfoClick,2 ;move para InfoClick o valor 2 jmp noClicked ;salta para noClicked ;-------------------------------------------------------------------------- ;Botão Jogar Play1: cmp dx, 54 ;compara dx com 54 que é as coordenadas y do botao play jbe PlayNow ;se sim salta para PlayNow jmp noClicked ;se nao salta para noClicked PlayNow: mov InfoClick,2 ;move para InfoClicked o valor 1 jmp noClicked ;salta para noClicked ;--------------------------------------------------------------------------- ;Botão About Sobre1: cmp dx, 150 ;compara dx com 150 que é as coordenadas de y do botao About jbe ViewAbout ;senão sim salta para ViewAbout jmp noClicked ;senão salta para noClicked ViewAbout: mov InfoClick, 3 ;move para InfoClicked o valor 3 jmp noClicked ;salta para a label noClicked ;---------------------------------------------------------------------------- noClicked: pop dx ;puxa da pilha dx pop cx ;puxa da pilha cx pop bx ;puxa da pilha bx pop ax ;puxa da pilha ax ret ;termina o procedimento CheckClick endp ;-------------------------------------------------------------------------------------------------------------- ; Rotina para verificar o clique do botao do about, para voltar ao menu ;-------------------------------------------------------------------------------------------------------------- CheckClick2 proc near push ax ;guarda na pilha ax push bx ;guarda na pilha bx push cx ;guarda na pilha cx push dx ;guarda na pilha dx ;-------------------vericações dos botõe do rato------------------ mov ax, 05h ;interrupçao do rato MOV BX,0 ;para verificar se o botão do lado esquerdo foi clicado int 33h ;invoca a iterrupção do 33h do dos AND AX,1b ; faz um and, para ver se o bit é 0 ou 1 cmp ax,1b ;verifica se o botão esquerdo do rato foi clicado je ClickedA ;se sim salta para a label ClickedA ;como não foi clicado entao sai pop dx ;puxa da pilha dx pop cx ;puxa da pilha cx pop bx ;puxa da pilha bx pop ax ;puxa da pilha ax ret ;termina o procedimento RET ClickedA: cmp cx, 468 ;compara cx com 468, que é as coordenadas x do botão ok jae btnAbout2 ;se sim salta para a label btnAbout2 jmp noClicked2 ;senão salta para a label noClicked2 btnAbout2: cmp cx, 565 ;compara cx com 565, que é as coordenadas x do botão ok jbe btnAbout3 ;se sim salta para a label btnAbout3 jmp noClicked2 ;senão salta para a label noCLicked2 btnAbout3: cmp dx, 86 ;compara dx com 86, que é as coordenadas y do botão ok jae btnAbout4 ;se sim salta para btnAbout4 jmp noClicked2 ;senão salta para a label noClicked2 btnAbout4: cmp dx, 102 ;compara dx com 102, que é as coordenadas de y do botão Ok jbe btnAboutYes ;se sim salta para btnAboutYes jmp noClicked2 ;senão salta para a label noClicked2 btnAboutYes: mov InfoClick,4 ;move para InfoClicked o valor 4 ;---------------------------------------------------------------------------- noClicked2: pop dx ;puxa da pilha dx pop cx ;puxa da pilha cx pop bx ;puxa da pilha bx pop ax ;puxa da pilha ax ret ;termina o procedimento CheckClick2 endp ;-------------------------------------------------------------------------------------------------------------- ; Rotina para limpar o ecra ;-------------------------------------------------------------------------------------------------------------- ClearScreen PROC NEAR MOV AH, 00H ; Esta chamada da INT 10H limpa o ecran INT 10H ;invoca a iterrupção do 10h do dos RET ;termina o procedimento ClearScreen ENDP ;-------------------------------------------------------------------------------------------------------------- ; Rotina para mostrar o ecra About ;-------------------------------------------------------------------------------------------------------------- DrawAbout proc near mov x, 3 ;move para x o valor 3, que é onde inicialmente irá desenhar, ou seja cordenada x mov y, 3 ;move para y o valor 3, que é onde inicialmente irá desenhar, ou seja cordenada y lea di,About0 ;endreço do About0 que tem o texto do about0 CALL printLabelButtons ;chama o procedimento printLabelButtons mov y, 5 ;move para y o valor 5, ou seja a cordenada y=5 lea di,About1 ;endreço do About1 que tem o texto do about1 CALL printLabelButtons ;chama o procedimento printLabelButtons mov y, 6 ;move para y o valor 7, ou seja a cordenada y=7 lea di,About2 ;endreço do About1 que tem o texto do about2 CALL printLabelButtons ;chama o procedimento printLabelButtons mov y, 7 ;move para y o valor 7, ou seja a cordenada y=7 lea di,About3 ;endreço do About1 que tem o texto do about3 CALL printLabelButtons ;chama o procedimento printLabelButtons ret ;termina o procedimento DrawAbout endp ;-------------------------------------------------------------------------------------------------------------- ; Rotina para sair do modo grafico ;-------------------------------------------------------------------------------------------------------------- ReturnToGraphicMode proc near mov ax,03h ;Volta ao modo grafico anterior int 10h ;invoca a iterrupção do 10h do dos ret ;termina o procedimento ReturnToGraphicMode endp ;-------------------------------------------------------------------------------------------------------------- ; Rotina para fechar o ficheiro ;-------------------------------------------------------------------------------------------------------------- CLOSEFIL PROC near PUSH AX ;guarda na pilha o ax PUSH BX ;guarda na pilha o bx MOV AH,3EH ;prepara para fechar o ficheiro MOV BX,FHAND ;indica o file handle INT 21H ;fecha POP BX ;puxa o valor bx da pilha POP AX ;puxa o valor ax da pilha RET ;termina o procedimento CLOSEFIL ENDP MYCODE ENDS END |
programa que le um ficheiro com contas e guarda outro ficheiro com contas e resultado
Reads a file with numbers, and saves in another file the result with the sums |
;programa que le um ficheiro com contas e guarda outro ficheiro com contas e resultado STACK SEGMENT PARA STACK ;define o seg pilha DB 64 DUP ('mystack ') STACK ENDS MYDATA SEGMENT PARA 'DATA' MESG1 DB 'Introduza o nome do ficheiro: ','$' nomefich DB 12 DUP (' '),0 ; nome do ficheiro lido do teclado nomefichguarda DB 12 DUP (' '),0 ; nome do ficheiro lido do teclado ;nomefich db '.\teste.txt',0 ;nome do ficheiro, terminado com 0 ;nomefichguarda db '.\teste.res',0 ;nome do ficheiro, terminado com 0 ;filenam db '.\teste.res',0 ;nome do ficheiro, terminado com 0 NumTemp dw ? Num1 dw ? Num2 dw ? Num3 dw ? BUF DB 4 DUP (' '),'$' ; buffer para a pilha line db 0dh,0ah,'$' PrimNum DB 4 DUP (' '),'$' SegNum DB 4 DUP (' '),'$' TercNum DB 4 DUP (' '),'$' PrimOper DB 4 DUP (' '),'$' SegOper DB 4 DUP (' '),'$' TercOper DB 4 DUP (' '),'$' Result Dw 4 DUP (' '),'$' Temp DB 1 DUP (' '),'$' Contador dw 0 Caracter dw 0 fhand dw ? ; handle do ficheiro PrimNumBin Dw ? SegNumBin Dw ? TercNumBin Dw ? MYDATA ENDS MYCODE SEGMENT PARA 'CODE' ;define o segmento cod. para o MASM ;------------------------------------------------------------------------ MYPROC PROC FAR ;nome do procedimento MYPROC ASSUME CS:MYCODE,DS:MYDATA,SS:STACK PUSH DS ;guarda na pilha o seg. DS SUB AX,AX ;garante zero no AX PUSH AX ;guarda zero na pilha MOV AX,MYDATA ;coloca em AX a posiÁ„o dos DADOS MOV DS,AX ;coloca essa posiÁ„o no reg. DS MOV ES,AX ;coloca essa posiÁ„o no reg.ES ;Mostra o cabeÁalho "introduza o nome do ficheiro LEA DX, MESG1 ; endereÁo da sring com os caracteres lidos MOV AH,09h ; display de strings, config INT21h INT 21H ; invoca a interrupÁ„o do 21h do DOS ;fim mostra cabeÁalho call LerNomeFicheiro LEA DX, nomefich ;nome do fich a abrir call abrefich ;abre ficheiro xor ax,ax call GuardarLido;guarda nas variaveis call closefil;como chegou ao fim do ficheiro fecha-o ;guarda nas variaveis correctas os valores LEA SI, PrimNum call readn mov ax,NumTemp mov PrimNumBin,ax LEA SI, SegNum call readn mov ax,NumTemp mov SegNumBin,ax LEA SI, TercNum call readn mov ax,NumTemp mov TercNumBin,ax ;aqui calcula a conta call contas ;Fim de calcular a conta ;cria o ficheiro .res com os resultados call CopiaSTR LEA DX, nomefichguarda ;nome do fich a abrir call creatfil LEA DX, nomefichguarda ;nome do fich a abrir call openfil ;abre ficheiro para escrita LEA DX, nomefichguarda ;nome do fich a abrir call guardanoficheiro mov ax,Result;Result tem 9Ch = 156d call GuardaResult;guarda no ficheiro o resultado em decimal call closefil ret MYPROC ENDP ;copia uma string para outra ;ENTRADA: nomefich - com o nome do ficheiro inicial ;SAIDA: nomefichguarda - com o nome do ficheiro a guardar CopiaSTR PROC near mov bx,0;inicia o contador a zero ;mov cx,conta_caract;inicia bx com o numero total de caracteres next_char: mov al,nomefich[bx];move para al o conteudo da posiÁ„o mov nomefichguarda[bx],al;move para newstring o conteudo do al cmp al,'.';se encontra o . salta para o fim je fim inc bx;incrementa o contador jmp next_char ;se n„o continua a copiar fim: ;mov newstring[bx+1],'$';como chegou ao fim, acrescenta o $ de fim de string mov nomefichguarda[bx+1],'r' mov nomefichguarda[bx+2],'e' mov nomefichguarda[bx+3],'s' ret CopiaSTR ENDP ;Efectua as contas ;Entrada PrimNumBin;SegNumBin;TercNumBin ;PrimOper;SegOper ;SAIDA Result contas proc near cmp PrimOper,'*' je primeirovezes cmp PrimOper,'+' je primeiromais cmp PrimOper,'-' ;je primeiromenos call primeiromenos;teve q ser assim se n„o dava erro em salto grande de mais xor DX,DX jmp contasFIM primeirovezes: cmp SegOper,'*' je mult_mult cmp SegOper,'+' je mult_mais cmp SegOper,'-' je mult_menos mult_mult: ;Result=PrimNumBin*SegNumBin* TercNumBin mov ax,PrimNumBin mov cx,SegNumBin mul cx;ax=ax*cx mov cx,TercNumBin mul cx;dx:ax=ax*cx mov Result,ax jmp contasFIM mult_mais: ;Result=PrimNumBin*SegNumBin + TercNumBin mov ax,PrimNumBin mov cx,SegNumBin mul cx;ax=ax*cx mov cx,TercNumBin add ax,cx mov Result,ax jmp contasFIM mult_menos: ;Result=PrimNumBin*SegNumBin - TercNumBin mov ax,PrimNumBin mov cx,SegNumBin mul cx;ax=ax*cx mov cx,TercNumBin sub ax,cx mov Result,ax jmp contasFIM primeiromais: cmp SegOper,'*' je mais_mult cmp SegOper,'+' je mais_mais cmp SegOper,'-' je mais_menos mais_mult: ;Result=PrimNumBin+SegNumBin* TercNumBin mov ax,SegNumBin mov cx,TercNumBin mul cx;ax=ax*cx mov cx,PrimNumBin add ax,cx mov Result,ax jmp contasFIM mais_mais: ;Result=PrimNumBin+SegNumBin + TercNumBin mov ax,PrimNumBin mov bx,SegNumBin add ax,bx mov bx,TercNumBin add ax,bx mov Result,ax jmp contasFIM mais_menos: ;Result=PrimNumBin+SegNumBin - TercNumBin mov ax,PrimNumBin mov bx,SegNumBin add ax,bx mov bx,TercNumBin sub ax,bx mov Result,ax jmp contasFIM contasFIM: ret contas endp primeiromenos proc near cmp SegOper,'*' je menos_mult cmp SegOper,'+' je menos_mais cmp SegOper,'-' je menos_menos menos_mult: ;Result=PrimNumBin-SegNumBin* TercNumBin mov ax,SegNumBin mov cx,TercNumBin mul cx;ax=ax*cx mov cx,PrimNumBin sub cx,ax mov ax,cx mov Result,ax ret;jmp contasFIM menos_mais: ;Result=PrimNumBin-SegNumBin + TercNumBin mov ax,PrimNumBin mov bx,SegNumBin sub ax,bx mov bx,TercNumBin add ax,bx mov Result,ax ret;jmp contasFIM menos_menos: ;Result=PrimNumBin-SegNumBin - TercNumBin mov ax,PrimNumBin mov bx,SegNumBin sub ax,bx mov bx,TercNumBin sub ax,bx mov Result,ax ret;jmp contasFIM primeiromenos endp ;===PROCEDIMENTO HEX2ASCII ;n„o È usada para nada HEX2ASCII PROC near PUSH CX ;salva cx na pilha PUSH DX ;salva dx na pilha MOV CL,4 ;abre contagem rotate MOV CH,4 ;abre contagem digito DISPH1: ROL AX,CL ;posicao do numero PUSH AX ;salva na pilha ax AND AL,0FH ;recebe digito hexadecimal ADD AL,30H ;ajusta-o para converter CMP AL,'9' ;compara com o '9' JBE DISPH2 ;salta para disph2 se entre nr 0 e 9 ADD AL,7 ;ajusta-o DISPH2: MOV AH,6 MOV DL,AL INT 21H ;manda o digito para o ecra POP AX ;tira da pilha para o ax para o restaurar DEC CH JNZ DISPH1 ;repete POP DX ;tira da pilha para restaurar dx POP CX ;tira da pilha para restaurar cx RET HEX2ASCII ENDP guardanoficheiro proc near LEA DX, PrimNum call writefil call indexnum ;posiciona-se no final do fich LEA DX, PrimOper call writefil call indexnum ;posiciona-se no final do fich LEA DX, SegNum call writefil call indexnum ;posiciona-se no final do fich LEA DX, SegOper call writefil call indexnum ;posiciona-se no final do fich LEA DX, TercNum call writefil call indexnum ;posiciona-se no final do fich LEA DX, TercOper call writefil ret guardanoficheiro endp ;****************************************************************** ;Procedimento para converter bin to ascii ;mostra no ecran em ascii o conteudo de AX ;ENTRADA: AX com o valor em binario ;SAIDA: impressao no ecran do numero GuardaResult proc near push dx;guarda o dx, cx e bx push cx push bx xor cx,cx;limpa cx mov bx,10;coloca em bx o valor de 10 dispx11: xor dx,dx; limpa dx div bx push dx; guarda o resto inc cx; incrementa o contador or ax,ax; testa quoficiente jnz dispx11; se n„o for zero dispx21: pop dx; mostra o numero mov ah,6 add dl,30h; converte para ASCII ;int 21h; mostra mov Temp, dl push cx call indexnum ;posiciona-se no final do fich LEA DX, Temp mov ah,40h mov bx,fhand mov cx,1 ;lea dx,Mesg1 int 21h pop cx loop dispx21;repete pop bx;restaura o bx,cx e dx pop cx pop dx ret GuardaResult endp ;****************************************************************** ;Procedimento que converte de ascii para bin ;neste caso separa a string ex: 3401+323= ;colocando em Num1 o 3401 e em Num2 o 323 ;ENTRADA: antes ter que ser feito: LEA DX, polin - para passar o endereÁo da string polin ;SAIDA: Num1; Num2; readn proc near push bx ;guarda bx push cx ;guarda cx mov cx,10 ;coloca 10 em cx xor bx,bx ;limpa o resultado ;LEA DX, polin ; endereÁo da sring com os caracteres lidos tambem pode ser assim: ;mov si,offset polin readn1: mov al,[si] ;cmp al,0dh ;testa com 0 cmp al,20h ;testa com espaÁo je primeiron ;salta se menor cmp al,24h ;testa com $ je primeiron ;salta se menor sub al,'0' ;converte para BCD push ax mov ax,bx ;multiplica por 10 mul cx mov bx,ax ;guarda o produto pop ax xor ah,ah add bx,ax ;adiciona BCD ao produto inc si;passa para o caracter seguinte jmp readn1 ;repete primeiron: mov ax,bx ;move o binario para ax mov NumTemp,ax ;guarda o primeiro numero inc si;passa para o caracter seguinte xor ax,ax ;limpa o ax para poder continuar a ler xor bx,bx;limpa o bx para poder continuar a ler jmp readn2 ;sai readn2: pop cx ;restaura o bx e o cx pop bx ret readn endp ;Guarda nas variaveis correctas os valores lidos ;ENTRADA: ;SAIDA: GuardarLido proc near mov contador,1 mov caracter,0 ;call abrefich ;abre ficheiro ler_ini: mov cx, 1 ;coloca em cx o numero de bytes a ler dados pela variavel tamanho=1 call lefich ;lÍ os dados(1 a 1) cmp ax, cx ;valida o eof comparando os dados lidos com os dados a ler jne eof_final_extrai_cor_imagem; se ax n„o for igual ao cx (se os dados a ler n„o forem iguais aos dados lidos) ent„o chegou ao fim cmp BUF,0dh;se encontra 0a=LF je ler_ini cmp BUF,0ah;se encontra 0a=LF je conta_cor_imagem mov cx,contador mov bx,caracter call GuardaVariavel inc caracter jmp ler_ini ;continua a ler ate chegar ao eof encontraenter: ;inc contador ;mov caracter,0 jmp ler_ini conta_cor_imagem: inc contador mov caracter,0 jmp ler_ini eof_extrai_cor_imagem: ;como encontrou 4 LF agora È a imagem xor dx,dx ;call MostraLido;mostra a imagem (pixel a pixel) inc contador jmp ler_ini eof_final_extrai_cor_imagem: ret GuardarLido endp ;procedimento que guarda a linha lida nas variaveis ;entrada: BUF, com endereÁo da sring com os caracteres lidos ;entrada BX com o numero da linha lida GuardaVariavel proc near mov al,BUF cmp cx,1 je Linha_11 cmp cx,2 je Linha_21 cmp cx,3 je Linha_31 cmp cx,4 je Linha_41 cmp cx,5 je Linha_51 cmp cx,6 je Linha_61 Linha_11: mov PrimNum[bx],al;move para newstring o conteudo do al ret Linha_21: mov PrimOper[bx],al ret Linha_31: mov SegNum[bx],al ret Linha_41: mov SegOper[bx],al ret Linha_51: mov TercNum[bx],al ret Linha_61: mov TercOper[bx],al ret ret GuardaVariavel endp ;antes teremos que fazer lea si, polin ; INPUT - SI - endereÁo do inicio da string ; OUTPUT - ; mostra uma string no ecran caracter por caracter mostra_string proc near ;lea si, polin1 push ax push dx again: mov dl, '$' cmp dl, [SI] je fim_mostra_string mov ah, 06 mov dl, [SI] int 21h inc si jmp again fim_mostra_string: pop dx pop ax ret mostra_string endp ;****************************************************************** ;Procedimento para converter bin to ascii ;mostra no ecran em ascii o conteudo de AX ;ENTRADA: AX com o valor em binario ;SAIDA: impressao no ecran do numero dispx proc near push dx;guarda o dx, cx e bx push cx push bx xor cx,cx;limpa cx mov bx,10;coloca em bx o valor de 10 dispx1: xor dx,dx; limpa dx div bx push dx; guarda o resto inc cx; incrementa o contador or ax,ax; testa quoficiente jnz dispx1; se n„o for zero dispx2: pop dx; mostra o numero mov ah,6 add dl,30h; converte para ASCII int 21h; mostra loop dispx2;repete pop bx;restaura o bx,cx e dx pop cx pop dx ret dispx endp ;********************************************************************* ;procedimento para mostrar o conteudo de uma variavel ;entrada: fazer antes LEA DX, MESG1 ; em que MESG1 È a variavel que queresmo ver mostraSTR proc near MOV AH,09h ; display de strings, config INT21h INT 21H ; invoca a interrupÁ„o do 21h do DOS ret mostraSTR endp ;------------------------------------------------ ;procedimento que guarda a linha lida nas variaveis ;entrada: BUF, com endereÁo da sring com os caracteres lidos ;entrada BX com o numero da linha lida mostra proc near cmp bx,1 je Linha_1 cmp bx,2 je Linha_2 cmp bx,3 je Linha_3 cmp bx,4 je Linha_4 cmp bx,5 je Linha_5 cmp bx,6 je Linha_6 Linha_1: lea dx, PrimNum ret Linha_2: lea dx, PrimOper ret Linha_3: lea dx, SegNum ret Linha_4: lea dx, SegOper ret Linha_5: lea dx, TercNum ret Linha_6: lea dx, TercOper ret ret mostra endp ;procedimento que lÍ os dados ;Entrada: BUF-buffer para onde vai ler ; fhand-handler do ficheiro que vamos ler ;CX-numero de bytes a ler ;BX-linha a ler (variavel) ;Saida: AX-codigo de erro ou o numero de bytes lidos lefich proc near ;mov ah,3fh ;ler um ficheiro ;call mostra;vai guardar o lido na variavel correcta ;mov bx, fhand ;coloca em bx o file handler ;int 21h ;ret mov ah,3fh ;ler um ficheiro lea dx, BUF ;endereÁo do buffer com os dados lidos mov bx, fhand ;coloca em bx o file handler int 21h ret lefich endp ;cria o ficheiro de resultados creatfil proc near push ax push cx push dx mov ah,3ch mov cx,00h ;lea dx,filenam int 21h mov fhand,ax pop dx pop cx pop ax ret creatfil endp writefil proc near push bx push cx push dx mov ah,40h mov bx,fhand mov cx,4 ;lea dx,Mesg1 int 21h mov ah,40h mov bx,fhand mov cx,2 lea dx,line int 21h pop dx pop cx pop bx ret writefil endp openfil proc near push ax push dx mov al,01h mov ah,3dh ;lea dx,filenam int 21h mov fhand,ax pop dx pop ax ret openfil endp ;procedimento para abrir um ficheiro ;entrada: nomefich-nome do ficheiro ;antes de chamar fazer LEA DX, nomefich ;nome do fich a abrir ;saida: fhand-handler do ficheiro abrefich proc near ;push ax ;push dx MOV AL,00H ;00-so para leitura; 01-so para escrita; 02-para leitura e escrita MOV AH,3DH ;parametro de abertura, È sempre 3DH ;LEA DX, nomefich ;nome do fich a abrir INT 21H ;abre MOV fhand,AX ;guarda o file handle do fich ;pop dx ;pop ax ret abrefich endp ;coloca-se no fim do ficheiro indexnum proc near mov al,02h mov ah,42h mov bx,fhand mov cx,00h mov dx,00h int 21h ret indexnum endp ;Procedimento que fecha o ficheiro ;Entrada: fhand- handler do ficheiro a fechar closefil proc near push ax push bx mov ah,3eh mov bx,fhand int 21h pop bx pop ax ret closefil endp ;Le nome do ficheiro a abrir LerNomeFicheiro PROC near ; nome do procedimento MYPROC MOV BX,00 ; carrega em BX o index 0 do buffer BUFF ; leitura e display dos caracteres lidos do teclado MOV AH,01h ; leitura de um caracter, config INT21h MOV CX,00h ; coloca o contador a zero HERE: INT 21H ; invoca a interrupÁ„o do 21h do DOS CMP AL,0Dh ; verifca se e' o carriage return JE NOMORE ; se AL==0Dh salta para a frente MOV nomefich[BX],AL ; guarda o caracter lido no buffer CMP AL,0Dh ; verifca se e' o carriage return JE NOMORE ; se AL==0Dh salta para a frente CMP CX,79 ; ja' lemos 80 caracteres? JE NOMORE ; se sim salta para a frente INC CX ; se n„o, incrementa o contador de caracteres INC BX ; e incrementa o index do buffer JMP HERE ; volta para ler mais um caracter NOMORE: INC BX MOV nomefich[BX],'$' ret LerNomeFicheiro endp ;--------------------------------------------------- MYCODE ENDS ;fim do codigo END; FIM de todo o programa |
Perguntas teoricas
Considere o seguinte sistema computacional baseado no microprocessador 8086_.
<-------------- IMG1------------------------>
a) Qual a função dos 2 chips 74LS245 e dos 3 chips 74LS373? Explique o que os distingue e qual a razão deste esquema todo.
2 chips 74LS245 – servem de bus de dados (16 bits)
3 chips 74LS373 – servem de BUS de endereços (20 bits)
O 8086 partilha o bus de dados com o bus de endereços.
O 373 faz uma contenção de endereços, para o enviar para a memória
b) Qual a função da linha DT/R?
Funciona como linha de controlo. Envia num sentido ou noutro conforme o estado do DT/R
c) Qual a capacidade de armazenamento total do sitema de memória em kBytes?
220bits = 1048576 bytes
1048576 / 1024 = 1024 kbytes
d) Qual a largura em bits, do bus de dados
16 bits Bus de dados
e) Qual a largura em bits, do bus de endereços?
20 bits Bus de endereços
Considere o seguinte sistema computacional:
<-------------- IMG2------------------------>
<-------------- IMG3------------------------>
a) Qual a função dos 2 chips ‘373? E qual a função do chip ‘245? Explique o que distingue esses chips e qual a razão do circuito adicional ao µP.
2 chips 373 – servem de bus de endereços (15 bits)
1 chip 245 – serve de BUS de dados (8 bits)
f) Qual a função da linha DT/R?
Funciona como linha de controlo. Envia num sentido ou noutro conforme o estado do DT/R
b) Qual a largura, em bits, do bus de dados?
8 bits bus de dados
c) Qual a capacidade de armazenamento total do sistema de memória em KBytes
1024 kb
d) Qual a largura, em bits, do bus de endereços?
15 bits, bus de endereços
Verdadeiro ou Falso - Assembly
Dizer se é verdadeiro ou falso:
Um bus de dados com 16 bits permite endereçar 216 células de memória distintas
Verdadeiro, 216 = 65536 bytes
Um bus de dados com 32 bits permite endereçar no máximo 4 Gbytes de memória
Verdadeiro, 232 = 4294967296 bytes
o bus de endereços é bidireccional
Falso, é Unidireccional. O bus de dados e o bus de controlo Bidireccional
as interrupções estão na BIOS e só o fabricante pode escreve novas interrupções
Falso, também estão no DOS e podem ser alteradas pelo programador
o processador 80286, 80386 e 80486 são processadores de 16 bits
Falso, 8086, 8088, 80286 são de 16 bits; 80286 e 80386 são de 32 bits
o processador 8086, 80286 são processadores de 16 bits; 80386, 80486, Pentium4 processadores de 32 bits; Intel core2 extreme quad core processadores de 128 bits
Falso, Intel core2 e quad core são processadores de 64bits
o processador 8086 utiliza páginas de 64 kbytes
Verdadeiro
no 8086-80496 a instrução CALL incrementa o registo SP
FALSO, a instrução call decrementa o sp
no 8086-80496 a instrução PUSH coloca um dado da pilha e decrementa o registo SP
Verdadeiro,
a memória virtual no microprocessador 80286 é endereçada através de dois componentes: o selector de segmentos (16 bits) e o deslocamento (16 bits)
Falso, processador e de 2bytes logo 16 bites
os registos internos de 8088 e de 8086 têm 24 bits e são iguais nos dois processadores
Falso, no 8086 Registos internos de 16 bits
o microprocessador 8088 em modo protegido de endereçamento, tem 4 niveis de protecção
Verdadeiro, Habilita 4 níveis de proteção:
Level 0 – kernel mode, Level 1 – RARAMENTE UTILIZADO, Level 2 – RARAMENTE UTILIZADO, Level 3 – user mode
um cluster de computadores utiliza um banco de memória comum para todos os µP
Falso, um cluster de computadores utiliza memoria própria não partilhada pelos µP
a instrução OUT permite ler um dado de um porto de entrada/saída
Falso, a instrução IN permite ler um dado de um porto de entrada/saída
a instrução IN permite escrever um dado de um ponto de entrada/saída
Falso, a instrução OUT permite escrever um dado de um ponto de entrada/saída
a unidade descodificadora de um processador CISC utiliza lógica combinacional enquanto que num RISC é utilizado microcódigo
Falso, CISC utiliza microcódigo enquanto que nos RISC é utilizda lógica computacional
o formato das instruções dos CISC adaptam-se melhor aos pipelines
Falso, o formato das instruções RISC adaptam-se melhores para pipelines
durante o ciclo de leitura de dados da memória, a linha de read (RD) pulsa antes do endereço ficar disponível
Falso, RD pulsa depois do endereço ficar disponível
hyperthreading ou multi-core são designações para a mesma tecnologia
Falso
os µP core2Quad partilham todas as caches L2 entre os vários cores melhorando assim o desempenho
Falso, partilham cache L2 entre os 2 cores
Von Newman previu que o número de transitores num chip iria duplicar em cada 18 meses originando uma duplicação da capacidade de computação
Falso, Gordon Moore
diz-se que um processador é de 16 bits se o bus de dados que liga o µP à memória tiver 16 bits
Falso, os registos internos é que tem que ser de 16 bits
processador 8086 utiliza memória virtual baseada em segmentação
Falso, só aparece com o 286
no 8086 – 80486 bastam as instruções ROL, ROR para fazer divisões por 10.
Falso, excepto se for em base HEX ou BIN
a instrução ROL permite fazer multiplicações por 2 de uma palavra binária
Falso, no ROL sai o bits mais significativo, e entra no menos significativo.
o OPCODE de uma instrução RISC tem tamanho variável para melhor se adaptar a tecnologia dos pipelines
Falso, tem tamanho fixo
o bus PCI Express transfere os dados de forma paralela e mais rápida
Falso, transfere de modo serie
o bus PCI Express permite maiores taxas de transferência porque tem mais pinos que os seus antecessores (PCI, ISA, EISA)
Falso, PCI Express tem menos pinos que PCI. Trabalha com mais frequência.
a uart é unidade responsável pela troca de dados entre disco e memória sem intervenção directa do CPU
???
a uart é a unidade responsável pelas comunicações via porto RS232
Verdadeiro
as interrupções podem ser geradas pelo software e ou pelo hardware
Verdadeiro
a unidade de DMA (direct memory Access) permite transferir dados do disco para a memória sem intervenção directa do processador
Verdadeiro
em sistemas SMP o problema da coerência de cache não se verifica se o sistema tiver uma memoria central partilhada por todos os µP
Falso, se o sistema tiver uma memoria central partilhada então vai haver problemas de coerência de cache.
Subscribe to:
Posts (Atom)