1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Urgente_ Assembly

Discussão em 'Programação' iniciada por minfm, 17 de Abril de 2007. (Respostas: 3; Visualizações: 2670)

  1. 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=12
    Agradecia 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
     
    Última edição: 17 de Abril de 2007
  2. SoundSurfer

    SoundSurfer Power Member

    Boas...
    Se colocares as tuas dúvidas em concreto, certamente terás mais ajuda.
     
  3. msdevweb

    msdevweb Power Member

    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.
     
    Última edição: 21 de Abril de 2007
  4. zxsat

    zxsat Power Member

    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)
    }
     

Partilhar esta Página