Mostrar mensagens com a etiqueta Assembly. Mostrar todas as mensagens
Mostrar mensagens com a etiqueta Assembly. Mostrar todas as mensagens

Soma de dois numeros hexadecimais


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

Read More... Soma de dois numeros hexadecimais

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

Read More... Paint

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

Read More... Desenha um quadrado apartir de coordenadas de um ficheiro

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

Read More... Carrega uma imagem

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

Read More... programa que le um ficheiro com contas e guarda outro ficheiro com contas e resultado

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



Read More... Perguntas teoricas

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.
Read More... Verdadeiro ou Falso - Assembly