View Full Version : Urgente_ Assembly


minfm
17-04-2007, 23:40
Olá! Boa noite!
Preciso de ajuda urgente!

Tenho que fazer um programa em assembly, cujo o objectivo é:

Multiplicar dois numeros inteiros de 0 a 9 pelo algoritmo das somas sucessivas..ou seja,tipo 3x4 é igual a 4+4+4=12Agradecia se alguém me pudesse dar uma dica para a resolução deste problema! É que eu comecei á pouco tempo a trabalhar com esta linguagem e ainda ñ a domino mto bem, mas preciso

Cumprimentos

SoundSurfer
17-04-2007, 23:42
Boas...
Se colocares as tuas dúvidas em concreto, certamente terás mais ajuda.

msdevweb
21-04-2007, 09:33
Boas, bem, pelo que percebi tens uma multiplicação usando somas, o que podes fazer, supondo que tens os dados já em variaveis seria (ver se percebi bem):

Exemplo:

AX = 3

BX = 4

queres AX*BX mas via somas

tens o comando ADD
ADD AX,BX ; soma 2 valores.
mas como queres multiplicação via soma, terás que fazer um ciclo (pode existir outra maneira, mas já nao lembro) neste caso um loop:

MOV CX,'NUM_X_A_SOMAR' neste caso:

MOV CX,BX ; numero de x a executar o loop, em seguida fazemos o loop (BX=4, certo?)^^
CALC_LOOP:

ADD AX,AX ;soma ao AX o valor dele proprio ou seja, AX=3, fica 3+3, enquanto CX<>0
DEC CX ;diminue o valor da variavel que indica o num de x a fazer o ciclo, neste caso ordenado pelo vaor CX que é igual ao BX

JNZ CALC_LOOP



Bom, no final do loop tens o resultado da tua multiplicação na "var" AX

Poderás usar um ciclo do_while ou até o for... é igual.

Acho que é isto, claro que tens que verificar, mas a estrutura do programa é mais ou menos isso... já não trabalho em asm à bastante tempo, e também nunca fui muito a fundo em asm.

Espero ter ajudado.

Um abraço.

zxsat
21-04-2007, 12:43
parece um trabalho de casa... LOL

de qq. modo, a técnica de fazer este tipo de coisa em assembly de qualquer processador é sempre a mesma, coloca-se o valor a somar num registo e usa-se um qualquer tipo de ciclo que é executado o numero de vezes que é necessário.

o facto de serem numeros de 0 a 9 facilita as coisas uma vez que não tem que haver preocupações com o overflow uma vez que o numero maior é 81. o único cuidado especial a ter é com o 0.

fazendo a coisa como uma função (em assembly z80 que é dos mais simples, provavelmente não é esse o assembly que estás a usar, mas tb não queres a papinha toda feita, pois não ?)

input: A-> valor, B-> numero de vezes a somar
output: A-> resultado

; ver primeiro se A ou B = 0
; a instrucção OR A faz o OR de o valor de A consigo próprio, só se A for zero é que é
; feito o set da flag Z (zero)
OR A
RETZ ; A = 0, sair logo
LD C,A ; guardar temporariamente valor de A
LD A,B ; testar o valor de B
OR A
RETZ
LD A,C ; recuperar o valor de A
; o Z80 tem uma instrucção de ciclo boa para estas coisas, só numa
; instrucção decrementa o valor do registo B e faz o check se é zero e salta para um label se não for
DEC B ; O ciclo é executado B-1 vezes, já que é sempre feito pelo menos 1 ADD A,A
LOOP: ADD A,A
DJNZ LOOP
RET

Numa linguagem qualquer de alto nivel seria qq. coisa do estilo
soma(A,B)
{
if(A==0 OR B==0) return(0)
B=B-1
do {
A=A+1
B=B-1
} while(B>0)
return(A)
}