removido
(usa Nenhuma)
Enviado em 30/03/2013 - 23:57h
lagisck escreveu:
Eu nem sabia q existia tipos de assembly ele apenas deu uma aula sobre a linguagem e pediu 3 exercicios eu me enrosquei nesse ae, ele passou o simulador SimPsim.
Obrigado
Assembly depende da arquitetura. Trabalha com instruções de processador, com instruções que seriam melhor representadas por sequências de bytes.
E cada processador tem uma representação diferente da outra. Se por exemplo o hexadecimal "001a" representasse um tipo de soma nessa arquitetura mais comum x86, ele poderia representar uma multiplicação numa outra qualquer, tipo a arquitetura do processador arm.
Daí usam-se aqueles nomes de instruções: mov, add, sub, mul, call ... prá não ter que decorar o código de cada uma.
Mesmo assim existem estilos diferentes de se escrever um código. Em um tipo de código o correto é escrever "MOV AX, 4" e em outro pode ser "MOV 4, AX" ou "MOV $4, %AX" ...
Encontrei seu simulador em
http://ultradownloads.com.br/tag/simulador-assembly/1,,,,,,2,1.html
A boa notícia é que ele trabalha com a arquitetura 8086, bastante antiga e bem simples. Há material disponível.
Sobre fazer os cálculos, soma adição, divisão, isso é mais simples e pode ser feito com instruções simples. A parte chata é como exibir esses resultados.
Se for prá MSDOS, tem que usar umas instruções específicas com códigos como "INT 13h" que são dele mesmo. Provavelmente esse simulador use algo assim.
Se fosse em Linux, seria outra maneira e num dos casos usa-se "int 0x80".
Sinceramente não sei se há atualmente espaço dentro do win prá executar um "int 13h" não sendo uma emulação. O que se usa são chamadas para DLLs e a coisa fica nada parecida com Assembly.
*****
No caso da sua dúvida, há um mnemônico, algo como CMP que faz a comparação entre dois valores.
Se você dividiu um número por dois e quer saber se ele é par, tem que pegar o resto da divisão e comparar com zero.
Se o resto estiver em DX, então fica algo como "CMP DX, 0" ou "CMP 0, DX", a sintaxe que for aceita.
Existe um conjunto de registradores, cujos nomes corretos são FLAGS. O que você vai fazer é usar um mnemônico que verifica nas flags se aconteceu o que você esperava. No caso é um desvio. ele manda a sequência de execução do código prá um outro ponto do código demarcado com uma LABEL.
Exemplos:
JG minhalabel - (Jump Greater) se na comparação um valor era maior que o outro, manda a execução continuar no ponto em que "minhalabel" está
JE minhalabel - (Jump Equal) se forem iguais
JGE minhalabel - se for maior ou igual
JL minhalabel - (Jump Less) se for menor ...
Isso é o que existe por detrás dos IF ... THEN ... ELSEIF ... ELSEIF ... ELSE das linguagens. São executadas inúmeras comparações prá valer um IF e por detrás de um THEN, ELSEIF e ELSE existem diversas formas de JMP, JG, JZ ... literalmente uns 20 tipos.