Professional Documents
Culture Documents
Prof.: Alexsandro Soares Alexandre dos Santos Rodrigues Wattyla Calazans Gomes de Oliveira 8 de maro de 2012 c
Resumo
Este relatrio aborda todo o contedo necessrio para a construo de um compilador o u a ca para a linguagem MiniJava, utilizando do Netwide Assembler(NASM). Tambm faz parte e deste, toda a experiencia adquirida na matria de Compiladores do curso de Cincia da Come e putao da Universidade Federal de Uberlndia no ano de 2012. ca a
1) Introduo ca
Este guia descreve a linguagem de programao MiniJava, que ser usada como linguaca a gem fonte para o projeto a disciplina Construo de Compilador da disciplina. MiniJava um ca e subconjunto da linguagem Java, ou seja, todo programa MiniJava tambm um programa e e Java, mas h muitas caracter a sticas da linguagem Java que no aparecem em MiniJava. Por a exemplo, a sobrecarga de mtodos no permitida em MiniJava, e o unico tipo de array e a e poss um array de inteiros. vel e Ao nal apresentamos alguns programas de escrito em MiniJava e o mesmo programas em Nasm. Um dos objetivos a ser alcanaado por este trabalho o de fazer com que um programa c e escrito em MiniJava seja compilado pela NASM.
uma linguagem de alto-n vel. De facto, torna-se muito complicado para os programadores humanos escrever programas usando a linguagem purado processador (linguagem-mquina), a a qual constitu por um conjunto mais ou menos extenso de bits (ex: a instruo mov e da ca ah,40h, muito usada em assembly, corresponde a 1011010010000000 - bits a unica coisa e que as mquinas entendem!). O assembler atribui nomes (mnemnicas) aos conjuntos de a o bits que constituem as instrues do processador, facilitando a sua compreenso pelos humaco a nos. O assembler tambm chama a si a execuo de um conjunto de aces necessrias para e ca co a que um programa possa ser executado (p.ex. o controlo de certos registos do processador), escondendo essas operaes ao programador. co
2.1.2) No Linux
2
Podemos achar a verso para rodar o NASM em Linux no seguinte site SourceForge.net. a Aps a instalao da verso desejada, crie um diretrio na area do usurio e coloque o nasmo ca a o a XXX.tar.gz (onde XXX representa a verso do nasm) neste diretrio e o descompacteo arquivo a o de instalao. Feito isso, abrir o tar do arquivo de instalao nesse diretorio: tar xvf nasmca ca xxx.tar, entrar no diretrio criado durante o processo de untar: cd nasm-xxx. Para mais o informaes, abrir o arquivo INSTALL localizado no diretrio. co o
LOOP : Decrementar o contedo do registrador contador CX e provocar um desvio no u uxo do processamento para o operando-alvo, se o valor em CX ainda no for 0. a MOV - Move : Copiar o contedo do operando-fonte para o operando-destino. O contedo u u da fonte no afetado. a e MUL - Multiplicao : Efetuar uma multiplicao no sinalizada entre o contedo do acuca ca a u mulador (AL ou AX) pelo operando-fonte, devolvendo o resultado no acumulador AX (caso a operao tenha envolvido AL com um operando de 8 bits), ou em DX e AX (caso a operao ca ca tenha envolvido AX e um operando de 16 bits). POP : Retirar a palavra armazenada no topo da pilha, colocando-a no registrador ou posio de memria especicada que necessariamente deve ser de 16 bits. ca o PUSH : Colocar, na rea de memria usada como pilha, o contedo de um registrador ou a o u posio de memria. Esta rea endereada por SS e SP. ca o a e c RET - Retornar : Encerrar uma sub-rotina, transferindo o uxo do processamento para a instruo seguinte ` chamada da sub-rotina. ca a SUB - Subtrao : Efetuar uma subtrao entre o contedo do operando-fonte e o contedo ca ca u u do operando-destino. O resultado da operao estar no operando-destino. ca a
2.3) Registradores
EAX - registrador acumulador EBX - registrador base ECX - registrador contador EDX - registrador de dados ESI - registrador de ndice da fonte dos dados EDI - registrador de ndice do destino dos dados EBP - registrador ponteiro para a moldura de chamada de funo ca ESP - registrador ponteiro para a pilha de execuo ca Esses nomes derivam da forma como eram utilizados nas arquiteturas anteriores a IA32 (8086, 80286...), em que cada registrador desempenhava um papel espec co. Na arquitetura i386, todos eles so de uso geral, embora eles continuem a poder ser utilizados em seus papis a e tradicionais. Podemos tambm observar na gura 1 alguns outros registradores e os seus e bytes.
Dar o push em todas a variveis na pilha, com a intruo call voc chama a funo. A a ca e ca instruo call faz duas coisas. Primeiro ela d push do endereo da prxima instruo, que ca a c o ca e o endereo de retorno, na pilha. Em seguida modica o ponteiro de instruo eip (Instruction c ca Pointer) para apontar para o in cio da funo. Depois salvar o registrador do ponteiro da ca base, ebp (Base Pointer), com push ebp; .O registrador ebp tambem e conhecido por frame pointer. Copiar o ponteiro do topo da pilha para ebp com mov esp,ebp; . A funo chamada ca reserva espao na pilha para as variveis locais que ela ir precisar. Isso feito alterando c a a e o ponteiro do topo da pilha. Quando uma funo termina de ser executada, so feitas trs ca a e coisas. Primeiro, ela armazena o valor de retorno em eax. Segundo, a pilha alterada para e aonde ela estava antes de ser chamada . Terceiro, retorna o controle do programa para de onde ele foi chamado. A instruo ret usada para retornar o controle, dando um pop da ca e pilha, alterando o ponteiro de instruo, eip, para o valor que estava no topo da pilha. Resca tauramos o ponteiro da pilha esp e o ponteiro da base ebp para o qu eles eram antes da e funo ser chamada. ca mov ebp,esp; pop ebp; ret; Enm, o controle voltou para o cdigo que chamou a funo, e agora ele pode examio ca nar o valor de retorno em eax. O cdigo que chamou tambm precisa dar pop de todos os o e parmetros que foram colocados na pilha, para que a a pilha volte para o que ela era antes. a
3) Execuo do NASM ca
Ao instalar o NASM (vide item 2.1), o prximo passo ser abri-lo. Para isto, abra o o a Prompt de Comando e, digitando o comando cd, chegue at a pasta aonde foi colocado o e nasm.exe (exemplo cd c:/nasm/nasm-xxx). Veja a gura 2. Aps isso, voc estara na pasta o e do nasm, ento agora s faltar criar o executvel do arquivo assembly criado. Para isto, usaa o a a remos como exemplo um programa de nome exemplo1.asm. Ento agora, digite o comando a nasm -o exemplo1.com exemplo1.asm, e o executvel ser criado. Em seguida digita exema a plo1 para abrir o exemplo1.exe. Veja a gura 3, com os comandos de criao de executvel ca a mais execuo do arquivo. ca
4) Programas em NASM
A seguir apresentaremos uma sequncia de programas desenvolvidos e na linguagem NASM e MiniJava. 4.1) Programa Vazio start : mov AH, 0 i n t 21h ; i n i c i o do programa ; AH = 0 , e s t a f u n a o pode s e r usada para c ; i n v o c a ao DOS, e n c e r r a n d o o programa
p u b l i c c l a s s ProgramaVazio { }
7
4.2) Programa Atribui s e c t i o n . data x : dd 0 mov eax , 4 mov [ x ] , eax i n t 21h ; i n i c i a a s e a o de dados , para implementa ao c c ; de dados ; d e c l a r a uma v a r i a v e l x com v a l o r i n i c i a l 0 ; move o v a l o r 4 para o r e g i s t r a d o r eax ; a t r i b u i o v a l o r de eax em x ; f i n a l i z a o programa
p u b l i c c l a s s ProgramaAtribui { p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { int x = 4; } } 4.3) Programa Soma s e c t i o n . data x : dd 0 y : dd 0 z : dd 0 mov eax , 2 mov [ x ] , eax mov eax , 5 mov [ y ] , eax ; ; ; ; ; inicia a de dados variavel variavel variavel s e a o de dados para implementa ao c c x com v a l o r i n i c i a l 0 y com v a l o r i n i c i a l 0 z com v a l o r i n i c i a l 0
; move o v a l o r 2 para eax ( eax = 2 ) ; a t r i b u i o v a l o r de eax para a v a r i a v e l x ; move o v a l o r 5 para eax ( eax = 5 ) ; a t r i b u i o v a l o r de eax para a v a r i a v e l y ; ( y = eax ) ; a t r i b u i o v a l o r de x a cx ( cx = x ) ; a t r i b u i o v a l o r de cx para z ( z = cx == 2 )
8
mov cx , [ x ] mov [ z ] , cx
; a t r i b u i o v a l o de y a cx ( cx = y ) ; a d i c i o n a o v a l o r de cx a z ( z = cx + z ) ; e n c e r r a o programa
p u b l i c c l a s s ProgramaSoma { p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { int x ,y , z ; x = 2; y = 5; z = x + y; } } 4.4) Programa Imprimi Soma section . text ; i n i c i a a s e a o t e x t o para implementa ao de c c ; textos ; i n i c i a a s e a o dados , para implementa ao de c c ; dados
s e c t i o n . data
x : t i m e s 4 db 0 ; 32 b i t s i n t e g e r = 4 b y t e s y : t i m e s 4 db 0 z : t i m e s 4 db 0 mov eax , 2 mov [ x ] , eax mov eax , 5 mov [ y ] , eax mov cx , [ x ] mov [ z ] , cx ; a t r i b u i a eax o v a l o r 2 ( eax = 2 ) ; a t r i b u i o v a l o r de eax para x ( x = eax ) ; a t r i b u i a eax o v a l o r 5 ( eax = 5 ) ; a t r i b u i o v a l o r de eax para y ( y = eax ) ; a t r i b u i a cx o v a l o r de x ( cx = x ) ; a t r i b u i a z o v a l o r de cx ( z = cx )
9
mov cx , [ y ] add [ z ] , cx
; a t r i b u i a cx o v a l o r y ( cx = y ) ; a d i c i o n a ao v a l o r de z o v a l o r de cx ; ( z = z + cx )
p r o c e d i m e n t o I m p r i m i r : ; come o do procedimento para i m p r i m i r c mov cx , [ z ] mov ax , cx mov dx , ax add dx , 0 ; a t r i b u i a cx o v a l o r de z ( cx = z ) ; a t r i b u i a ax o v a l o r de cx ( ax = cx ) ; a t r i b u i a dx o v a l o r de ax ( dx = ax ) ; c o n v e r t e dx em d i g i t o h e x a d e c i m a l ; obs : n e s s e c a s o como o numero e 7 entao ; nao ha problema em u s a r e s t e comando ; imprimi o v a l o r hex ; f i n a l i z a programa
p u b l i c c l a s s ImprimeSoma { p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { int x ,y , z ; x = 2; y = 5; z = x + y; System . out . p r i n t l n ( z ) ; } } 4.5) Programa Imprimi Texto s e c t i o n . data
; i n i c i a s e a o de implementa ao de dado c c
10
; c a d e i a de c a r a c t e r e s nomeada como s
p u b l i c c l a s s ProgramaAlo { p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { S t r i n g s = Alo Mundo ; System . out . p r i n t l n ( s ) ; } } 4.6) Programa Condicional s e c t i o n . data c e r t o db Certo$ e r r a d o db Errado$ ; x : dw 10 32; section . text o rg 100h mov ax , [ x ] ; cmp ax , 4 ; jnz erro
; i n i c i a s e a o de implementa ao de t e x t o c c ; p o s i a o de memoria u t i l i z a d a c
i n t 21h ; jmp fim ; ; e s c r e v e Errado s e x != 4 erro : l e a dx , [ e r r a d o ] ; aponta para o i n i c i o da c a d e i a mov ah , 9 ; e s c r e v e a c a d e i a de c a r a c t e r e i n t 21h ; ; p r o c e s s o para f i n a l i z a a o do programa c fim : mov ah , 4 Ch i n t 21h p u b l i c c l a s s ProgramaCondicional { p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { i n t x = 10 32; i f ( x == 4){ System . out . p r i n t l n ( CERTO ) ; } else{ System . out . p r i n t l n ( ERRADO ) ; } } } 4.7) Programa Repetio ca s e c t i o n . data s : db x = $ ; x : dw 0 ; section . text ;
12
o rg 100h ; mov ax , [ x ] ; while : cmp jnc add add jmp escreve : lea mov int lea mov int dx , [ s ] ; ah , 9 ; 21h ; dx , [ x ] ; ah , 9 ; 21h ; ax , 5 ; escreve ax , ax ; ax , 1 ; while ;
; p r o c e s s o para f i n a l i z a a o do programa c fim : mov ah , 4 Ch i n t 21h p u b l i c c l a s s ProgramaRepeticao { p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { int x = 0; w h i l e ( x < 5){ x += 1 ; } System . out . p r i n t l n ( x = +x ) ; } } 4.8) Programa Fatorial s e c t i o n . data
; i n i c i a s e a o de implementa ao de dado c c
13
msg db D i g i t e um numero$ msg2 db O f a t o r i a l de$ l e r db 6 3 , 0 t i m e s 64 DB 0 ; t i m e s 64 db 0 s e c t i o n . bass n : resd 0 fat : resd 0 section . text o rg 100h
; i n i c i a s e a o de implementa ao de t e x t o c c ; p o s i a o de memoria u t i l i z a d a c
l e a dx , [ msg ] ; aponta para o i n i c i o da c a d e i a mov ah , 9 i n t 21h Ler : lea mov int mov mov mov mov While : cmp jno mov add mov mul mov mov sub mov jmp cl ,0 Escreve ebx , [ f a t ] ebx , ebx eax , [ n ] ebx [ f a t ] , eax eax , [ n ] eax , 1 [ n ] , eax While
14
Escreve : mov lea int mov lea int ah , 9 dx , [ msg2 ] ; aponta para o i n i c i o da c a d e i a 21h ah , 9 ; dx , [ n ] ; aponta para o i n i c i o da c a d e i a 21h
; p r o c e s s o para f i n a l i z a a o do programa c fim : mov ah , 4 Ch i n t 21h import j a v a . u t i l . Scanner ; public c l a s s ProgramaFatorial { p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { Scanner s = new Scanner ( System . i n ) ; int n; int fat ; System . out . p r i n t l n ( D i g i t e um numero ) ; n = s . nextInt ( ) ; fat = 1; w h i l e ( n > 0){ fat = fat n; n = n1; } System . out . p r i n t l n ( O f a t o r i a l de +n+ Ac + f a t ) ; } } 4.9) Programa Positivo s e c t i o n . data
; i n i c i a s e a o de implementa ao de dado c c
15
msg db D i g i t e um numero$ ; msg2 db Numero p o s i t i v o $ ; msg3 db Zero$ ; msg4 db Numero n e g a t i v o $ ; l e r db 6 3 , 0 t i m e s 64 db 0 ; s e c t i o n . bss n : resd 1; section . text o rg 100h escreve : l e a dx , [ msg ] ; aponta para o i n i c i o da c a d e i a mov ah , 9 ; i n t 21h ; lerA : lea mov int mov mov cmp jno dx , [ l e r ] ax , 0AH; 21h ; cl , [ l e r ] ; [n] , cl ; cl , 0 ; else ;
; i n i c i a s e a o de implementa ao de t e x t o c c ; p o s i a o de memoria u t i l i z a d a c
else : mov c l , [ n ] ;
16
l e a dx , [ msg4 ] ; mov ah , 9 ; i n t 21h ; ; p r o c e s s o para f i n a l i z a a o do programa c fim : mov ah , 4 Ch i n t 21h import j a v a . u t i l . Scanner ; public c l a s s ProgramaPositivo { p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { System . out . p r i n t l n ( D i g i t e um numero ) ; Scanner s = new Scanner ( System . i n ) ; int n = s . nextInt ( ) ; i f ( n > 0){ System . out . p r i n t l n ( Numero p o s i t i v o ) ; } else{ i f ( n == 0){ System . out . p r i n t l n ( Zero ) ; } else System . out . p r i n t l n ( Numero n e g a t i v o ) ; }
17
; i n i c i a s e a o de implementa ao de dado c c
msg : db D i g i t e t r e s numeros i n t e i r o s e p o s i t i v o s $ ; msg2 : db T r i a n g u l o E q u i l a t e r o $ ; msg3 : db T r i a n g u l o Escaleno$ ; msg4 : db Essa medidas nao formam um t r i a n g u l o $ ; msg5 : db T r i a n g o l o I s o s c e l e s $ ; l e r : t i m e s 64 db 0 ; l e r A : t i m e s 64 db 0 ; l e r B : t i m e s 64 db 0 ; section x : resd y : resd z : resd . bss 1; 1; 1;
; i n i c i a s e a o de implementa ao de t e x t o c c ; p o s i a o de memoria u t i l i z a d a c
l e a dx , [ msg ] ; aponta para o i n i c i o da c a d e i a mov ah , 9 ; i n t 21h ; ; ler lea mov int mov mov lea mov dx , [ l e r ] ax , 0AH; 21h ; cl , [ l e r ] ; [x] , cl ; dx , [ l e r A ] ax , 0AH;
18
mov ax , [ x ] ; mov bx , [ y ] ; mov cx , [ z ] ; ; If add add cmp jnc add add cmp jnc add add cmp jnc ; if cmp jnz cmp jnz ; entao l e a dx , [ msg2 ] ; mov ah , 9 ;
19
ax , bx ; elseB ; bx , cx ; elseB ;
i n t 21h ; jmp fim ; elseB : ; if cmp jnz lea mov int jmp ax , bx ; comparacaoA ; dx , [ msg5 ] ; ah , 9 ; 21h ; fim ;
comparacaoA : cmp ax , cx ; j n z comparacaoB ; l e a dx , [ msg5 ] ; mov ah , 9 ; i n t 21h ; jmp fim ; comparacaoB : cmp bx , cx ; jnz elseC ; l e a dx , [ msg5 ] ; mov ah , 9 ; i n t 21h ; jmp fim ; elseC : ; if cmp ax , bx ; j z elseA ; cmp ax , cx ; j z elseA ; cmp bx , cx ;
20
j z elseA ; l e a dx , [ msg5 ] ; mov ah , 3 ; i n t 21h ; jmp fim ; elseA : lea mov int jmp dx , [ msg4 ] ; aponta para o i n i c i o da c a d e i a ah , 9 ; 21h ; fim ;
p u b l i c c l a s s ProgramaTriangulo { p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { Scanner s = new Scanner ( System . i n ) ; System . out . p r i n t l n ( D i g i t e t r A a s numeros i n t e i r o s e p o s int x = s . nextInt ( ) ; int y = s . nextInt ( ) ; int z = s . nextInt ( ) ; i f ( x < y + z && y < x + z && z < x + y ){ i f ( x == y && y == z ){ System . out . p r i n t l n ( T r i a n g u l o E q u i l a t e r o ) ; } else{ i f ( x == y | | x == z | | y == z ){ System . out . p r i n t l n ( T r i a n g u l o I s o s c e l e s ) ; } else{ i f ( ! ( x==y ) | | ! ( x==z ) | | ! ( y==z ) ) {
21
System . out . p r i n t l n ( T r i a n g u l o E s c a l e n o
} else{ System . out . p r i n t l n ( E s s a s medidas nao fo } } } } } } 4.11) Programa Intercala ; Codigo que f a z a l i g a a o com o g c c c . file i n t e r c a l a . cpp . section . t e x t $ g e t c h a r , x . linkonce discard . globl getchar getchar ; . def . scl 2; . type 32; . endef getchar : LFB2 : . cfi startproc ; push ebp ; . c f i d e f c f a o f f s e t 8; . c f i o f f s e t 5 , 8; mov esp , ebp ; . c f i d e f c f a r e g i s t e r 5; sub esp , 2 4 ; mov eax , imp iob ; mov 4 ( eax ) , eax ; leal 1( eax ) , edx ; mov eax , i m p iob ;
22
mov mov mov test js mov mov mov mov leal mov mov jmp L2 : mov mov call L3 :
edx , 4 ( eax ) ; imp i o b , eax ; 4 ( eax ) , eax ; eax , eax ; L2 ; imp i o b , eax ; ( eax ) , edx ; ( edx ) , a l ; a l , eax ; 1 ( edx ) , ecx ; imp i o b , edx ; ecx , ( edx ) ; L3 ; imp i o b , eax ; eax , ( esp ) ; filbuf ;
leave ; . c f i r e s t o r e 5; . c f i d e f c f a 4 , 4; ret ; . cfi endproc ; LFE2 : . def main ; . scl 2; . type 32; . endef . s e c t i o n . rdata , dr LC0 : . a s c i i %d \ 0 ; LC1 : . a s c i i %d \ 0 ; . text ; . globl main ; . def main ; . s c l
23
2;
. type
32;
. endef ;
main : LFB8 : . cfi startproc ; pushl %ebp ; . c f i d e f c f a o f f s e t 8; . c f i o f f s e t 5 , 8; movl %esp , %ebp ; . c f i d e f c f a r e g i s t e r 5; andl $ 16 , %esp ; subl $192 , %esp ; main ; Chama a f u n c a o main call movl $1 , 184(% esp ) movl 184(% esp ) , %eax movl %eax , 188(% esp ) jmp L5 L6 : leal movl sall addl movl movl call movl movl movl movl incl leal movl sall addl movl movl call 104( esp ) , eax ; 188( esp ) , edx ; $2 , edx ; edx , eax ; eax , 4 ( esp ) ; $LC0 , ( esp ) ; scanf ; 188( esp ) , eax ; 104( esp , eax , 4 ) , edx ; 184(% esp ) , eax ; edx , 24 ( esp , eax , 4 ) ; 184( esp ) ; 144( esp ) , eax ; 188( esp ) , edx ; $2 , edx ; edx , eax ; eax , 4 ( esp ) ; $LC0 , ( esp ) ; scanf ;
24
movl movl movl movl incl incl L5 : cmpl setle testb jne movl jmp L8 : movl movl movl movl call incl L7 :
188( esp ) , eax ; 144( esp , eax , 4 ) , edx ; 184( esp ) , eax ; edx , 24 ( esp , eax , 4 ) ; 184( esp ) ; 188( esp ) ; $9 , 188( esp ) ; al ; al , a l ; L6 ; $1 , 188 ( esp ) ; L7 ; 188( esp ) , eax ; 2 4( esp , eax , 4 ) , eax ; eax , 4 ( esp ) ; $LC1 , ( esp ) ; printf ; 188( esp ) ;
cmpl $19 , 188( esp ) ; setle al ; testb %a l , %a l ; jne L8 ; getchar ; call call getchar ; movl $0 , %eax ; leave ; . c f i r e s t o r e 5; . c f i d e f c f a 4 , 4; ret ; . cfi endproc ; LFE8 : . def filbuf ;
25
. scl
2;
. type
32;
. def . def
2; . scl
. type 2;
32; . type
. endef 32;
import j a v a . u t i l . Scanner ; public c l a s s ProgramaIntercala { p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { Scanner s = new Scanner ( System . i n ) ; i n t v e r t 1 [ ] = new i n t [ 1 0 ] ; i n t v e r t 2 [ ] = new i n t [ 1 0 ] ; i n t v e r t 3 [ ] = new i n t [ 2 0 ] ; int j = 1; int i = 1; w h i l e ( i <10){ vert1 [ i ] = s . nextInt ( ) ; vert3 [ j ] = vert1 [ i ] ; j = j + 1; vert2 [ i ] = s . nextInt ( ) ; vert3 [ j ] = vert2 [ i ] ; j = j + 1; i = i + 1; } i = 1; w h i l e ( i < 20){ System . out . p r i n t l n ( v e r t 3 [ i ] ) ; i = i + 1; } } } 4.12) Programa Salario s e c t i o n . data ; d e c l a r a c a o de dados s db O novo s a l a r i o e$ ; s t r i n g
26
p e r c : dd 0 ; v a r i a v e i s v a l o r : dd 0 s a l : dd 0 aumento : dd 0 novoSal : dd 0 s e c t i o n . t e x t ; d e c l a r a c a o de t e x t o o rg 500h ; e s p a o a l o c a d o c mov int lea mov int ah , 8 21h dx , [ s a l ] ah , 0 ah 21h
c a l l Calculo mov cx , [ v a l o r ] mov [ aumento ] , cx mov mov add mov cx , [ s a l ] dx , [ aumento ] cx , dx [ novoSal ] , cx
l e a eax , [ s ] mov ah , 9 i n t 21h l e a eax , [ novoSal ] mov ah , 9 i n t 21h mov ah , 4Ch i n t 21h
27
C a l c u l o : ; f u n a o c a l c u l o f a z v a l o r = s a l p e r c /100 c mov int lea mov mov mov mul mov div mov ret import j a v a . u t i l . Scanner ; public c l a s s ProgramaSalario { p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { Scanner s = new Scanner ( System . i n ) ; int sal = s . nextInt ( ) ; i n t aumento = c a l c u l o ( s a l ) ; i n t novoSal = soma ( s a l , aumento ) ; System . out . p r i n t l n ( O novo\+novoSal \ Ac +novoSal ) ; } p u b l i c s t a t i c i n t c a l c u l o ( i n t s a l ){ Scanner s = new Scanner ( System . i n ) ; int perc = s . nextInt ( ) ; int valor = s a l perc /100; return valor ; } p u b l i c s t a t i c i n t soma ( i n t x , i n t y ){ r e t u r n ( x+y ) ;
28
ah , 8 21h dx , [ p e r c ] ah , 0 ah ax , [ s a l ] cx , [ p e r c ] cx cx , [ p e r c ] cx [ v a l o r ] , dx
} } 4.13) Programa Salario 2 s e c t i o n . data ; d e c l a r a c a o de dados s db O novo s a l a r i o e$ ; s t r i n g p e r c : dd 0 ; v a r i a v e i s v a l o r : dd 0 s a l : dd 0 aumento : dd 0 novoSal : dd 0 s e c t i o n . t e x t ; d e c l a r a c a o de t e x t o o rg 500h ; e s p a o a l o c a d o c mov int lea mov int ah , 8 21h dx , [ s a l ] ah , 0 ah 21h
c a l l C a l c u l o ; chamada de f u n c a o mov cx , [ v a l o r ] mov [ aumento ] , cx c a l l Soma ; chamada de f u n a o c mov [ novoSal ] , cx l e a eax , [ s ] mov ah , 9 ; imprimi t e x t o s i n t 21h
29
l e a eax , [ novoSal ] mov ah , 9 ; imprimi numero i n t 21h mov ah , 4Ch i n t 21h C a l c u l o : ; f u n a o c a l c u l o f a z v a l o r = s a l p e r c /100 c mov int lea mov mov mov mul mov div mov ret Soma : ; f u n a o soma c mov cx , [ s a l ] mov dx , [ aumento ] add cx , dx ret import j a v a . u t i l . Scanner ; public c l a s s ProgramaSalario2 { p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {
30
ah , 8 21h dx , [ p e r c ] ah , 0 ah ax , [ s a l ] cx , [ p e r c ] cx cx , [ p e r c ] cx [ v a l o r ] , dx
Scanner s = new Scanner ( System . i n ) ; int sal = s . nextInt ( ) ; i n t aumento = c a l c u l o ( s a l ) ; i n t novoSal = s a l + aumento ; System . out . p r i n t l n ( Novo s a l a r i o Ac +novoSal ) ; } p u b l i c s t a t i c i n t c a l c u l o ( i n t s a l ){ Scanner s = new Scanner ( System . i n ) ; int perc = s . nextInt ( ) ; int valor = s a l perc /100; return valor ; } }
31