37119566 Apostila de Assembly

29
  APOSTILA DE  ASSEMBLY (1ª PARTE) INF 1091  TPD  PUC-RIO PROFESSOR: RODRIGO TOLEDO email: [email protected] - 1 -

description

Apostila-de-Assembly

Transcript of 37119566 Apostila de Assembly

  • APOSTILADE

    ASSEMBLY(1 PARTE)

    INF 1091 TPD PUC-RIO

    PROFESSOR: RODRIGO TOLEDOemail: [email protected]

    - 1 -

  • NDICE

    Revisando Conceitos e Sistemas de Numerao 03Nmeros Hexadecimais, Notao Binria...

    Arquitetura Interna do 8088 06Registradores, Memria Segmentada e Pilha

    O Programa Hello 10Segment/Ends, Assume, Proc/Endp, Mov, Lea, Int, Print String, Exit, DB/DW, Dup, Stack, End

    O Programa Hello2 14Call, Ret, Push/Pop, Xor, Sub/Add, Shr/Shl, Scroll Window, Get Current Video Mode, Cursor Position, Input Without Echo

    O Programa Tecla 19Cmp, Jb/Ja, Jmp, Inc, Loop, Label, Buffer Input, Char Output

    O Programa Impbin 23Je, Or, Clc/Stc, Rcl/Rcr, Adc

    Mul, Div e Exerccios 26

    - 2 -

  • REVISANDO CONCEITOS:

    Bit - a menor unidade de informao representvel em computadores.Byte - Conjunto de 8 bits, byte a menor unidade de memria enderevel. Os bits dentro de um byte so numerados da direita para a esquerda comeando com 0.Word - a quantidade de bits que pode ser processada em qualquer operao de transferncia de dados entre a CPU e a memria principal em um dado instante. Uma word composta de 2 bytes no caso dos IBM-PC.

    SISTEMAS DE NUMERAO:

    Existem diversos sistemas de numerao, sendo mais conhecido o decimal ou de base 10. Como j sabido, os computadores so mquinas binrias e portanto trabalham na base 2, onde os nmeros so representados com apenas dois algarismos, o 0 e o 1. Por ser muito difcil trabalhar com nmeros expressos na base 2, os seres humanos utilizam muitas vezes a base 16 (ou hexadecimal), pois uma forma mais compacta para representar os nmeros binrios.

    Existe uma relao direta de 4 dgitos binrios para um dgito hexadecimal (24 = 16). Portanto, possvel representar 1 byte (8 bits) com dois algarismos hexadecimais.

    Nmeros Hexadecimais:

    So nmeros expressos na base 16 e portanto dispem de 16 algarismos para a sua representao. Os algarismos utilizados para representar os nmeros hexadecimais e seus respectivos equivalentes

    3 - 3 -

  • decimais so: 0 1 2 3 4 5 6 7 8 9 A B C D E F, onde A=10, B=11, C=12, D=13, E=14, F=15.

    Para evitar confuses futuras, ns adotaremos a seguinte conveno para a representao de nmeros:- Nmeros hexadecimais, sero terminados pela letra "h". Ex: 10h.- Nmeros binrios, terminaro com a letra "b".- Nmeros hexadecimais que comecem com letra devero ser precedidos de 0. EX: 0B000h

    Como Converter Nmeros Hexadecimais em Decimais:

    Os nmeros decimais so formados da seguinte forma:

    273 = 2 x 100 = 200 7 x 10 = 70

    3 x 1 = 3 ---------------------------------

    273 = 273

    Analogamente:D3h = D = 13 x 16 = 208

    3 = 3 x 1 = 3 -------------------------------------

    D3h = 211

    Convertendo Decimal Para Hexa:

    Vejamos o que acontece quando dividimos um nmero decimal por 10:

    235 / 10 = 23 resto 5

    4 - 4 -

  • 23 / 10 = 2 resto 3 2 / 10 = 0 resto 2

    Os dgitos de 235 aparecem como restos em ordem contrria. Portanto, para converter decimais para hexa, voc deve dividir o nmero decimal por 16 e ir colhendo os restos da mesma maneira que foi feita para os nmeros decimais.

    1069 / 16 = 66 resto 13 66 / 16 = 4 resto 2 4 / 16 = 0 resto 4------------------------------------- 1069 = 42Dh

    Notao Binria:

    Como j foi dito, existe uma relao simples entre os nmeros binrios e os nmeros hexadecimais: um dgito hexadecimal corresponde a quatro dgitos binrios (24 = 16). A tabela abaixo permite converter qualquer nmero hexadecimal em binrio e vice-versa:

    Binrio Decimal Hexadecimal(0000) 0 0 (0001) 1 1 (0010) 2 2 (0011) 3 3 (0100) 4 4 (0101) 5 5 (0110) 6 6 (0111) 7 7 (1000) 8 8 (1001) 9 9 (1010) 10 A

    (1011) 11 B (1100) 12 C (1101) 13 D (1110) 14 E (1111) 15 F

    5 - 5 -

  • Exemplo: 0100 1101 0001 11004 D 1 C

    6 - 6 -

  • ARQUITETURA INTERNA DO 8088:

    14 registradores de 16 bits. Capaz de acessar 1Mb de memria. Capaz de acessar 65.535 portas de I/O

    Registradores de Uso Geral:

    AX BX CX DX (16 bits)AH/AL BH/BL CH/CL DH/DL (8 bits)

    AX: AcumuladorUsado em operaes aritmticas.

    BX: BaseUsado para indexar tabelas de memria (ex.: ndice de vetores).

    CX: ContadorUsado como contador de repeties em loop e movimentao repetitiva de dados.

    DX: DadosUso geral.

    Registradores de Segmento:

    So usados para a identificao de segmentos especficos de memria.

    CS: Code SegmentLocaliza o segmento de cdigo do programa que est sendo executado.O valor do CS no atualizvel.

    DS: Data SegmentLocaliza o segmento de dados do programa.

    SS: Stack Segment

    7 - 7 -

  • Localiza o segmento de pilha do programa.

    ES: Extra SegmentUsado para acessar um segmento de dados adicional.

    Registradores de Deslocamento:

    Usados em conjunto com registradores de segmento.

    IP: Instruction PointerUsado em conjunto com o CS para apontar exatamente para o byte da prxima instruo a ser executada.No h acesso direto.

    SP: Stack PointerUsado em conjunto com o SS para apontar o topo da pilha (stack).

    BP: Base PointerUsado para indicar a base da pilha.Particularmente importante para a passagem de parmetros em linguagem de alto nvel (como C).

    SI & DI: Source Index e Destination IndexParticularmente usados como instrues de string.Podem ser usados para indexar tarefas de memria.

    8 - 8 -

  • Registrador de Flags:

    Consiste em um grupo individual de bits de controle (flag), os quais podem ser inspecionados um a um como dados comuns, alm de poderem ser salvos ou recuperados como um grupo coordenado.

    Possui 16 bits como os demais registradores.

    OF: Overflow FlagSetada quando ocorre overflow aritmtico.

    DF: Direction FlagSetada para auto-incremento em instrues de string.

    IF: Interruption FlagPermite que ocorram interrupes quando setada.Pode ser setada pelo sistema ou pelo usurio.

    TF: Trap Flag (debug)Usada por debugadores para executar programas passo a passo.

    SF: Signal FlagResetada (SF=0) quando um resultado for um nmero positivo ou zero e setada (SF=1) quando um resultado for negativo.

    ZF: Zero FlagSetada quando um resultado for igual a zero.

    AF: Auxiliar FlagSetada quando h vai um na metade inferior de um byte.

    PF: Parity FlagSetada quando o nmero de bits 1 de um resultado for par.

    CF: Carry FlagSetada se houver vai um no bit de maior ordem do resultado.Tambm usada por instrues para tomadas de decises.

    Memria Segmentada:

    9 - 9 -

  • A memria dividida em um nmero arbitrrio de segmentos. O tamanho dos segmentos varia de 16 bytes a 64Kb. Cada segmento se inicia em uma posio perfeitamente divisvel por 16. O endereo segmentado sempre composto por duas words (32 bits). A anotao usada para representar um endereo : seg:desloc Exemplo:

    0041h : 0007h (CS = 0041h e IP = 0007h)endereo fsico:

    00410h+ 0007h====== 00417h

    A Pilha:

    Toma conta do programa em execuo. Pode servir para o armazenamento temporrio de dados. Serve para a passagem de parmetros. usada de baixo (endereo mais alto) para cima (endereo mais baixo). Empilha e desempilha apenas words (16 bits). Controle quanto a over flow da pilha responsabilidade do programador.

    10 - 10 -

  • O PROGRAMA HELLO

    SEGMENT e ENDS

    Sintaxe:Nome SEGMENT

    comandos e procedures...Nome ENDS

    Marcam o incio e o fim de um segmento, respectivamente. Um programa pode ter mais do que um segmento com o mesmo nome.

    ASSUME

    Sintaxe:Assume Reg_Seg : Nome_Seg

    Associa um segmento a um registrador de segmento. Reg_Seg pode ser: CS, DS, ES, SS

    PROC E ENDP

    Sintaxe:Nome PROC [distncia]

    comandos...Nome ENDP

    Marcam o incio e o fim de uma procedure (funo), respectivamente. O nome indicado para a procedure deve ser nico em todo o programa. A distncia pode ser NEAR (default) para uma procedure contida no segmento, ou

    FAR para uma procedure contida em outro segmento. A procedure deve conter ao menos um RET, que efetua o retorno da funo.

    LEA (Load Effective Address)

    Sintaxe: Lea destino, origemLgica: destino endereo (origem)Exemplo: Lea Bx, var (reg16, memria16)

    11 - 11 -

  • MOV

    Sintaxe: Mov destino, origemLgica: destino origemOperaes e Exemplos:

    Operao Exemploregistrador, registrador mov Bx, Cxmemria, acumulador mov var, Alacumulador, memria mov Ax, varmemria, registrador mov var, Siregistrador, memria mov Si, varregistrador, imediato mov var, 12reg_seg, reg16 mov Ds, Axreg16, reg_seg mov Ax, Dsmemria, reg_seg mov var, Ds

    INT (Interrupt)

    Sintaxe: Int num_intLgica:

    Empilha FlagsLimpa Trap FlagDesabilita intsCallfar int (chama o procedimento da interrupo)

    Observao: A interrupo 21h contm os servios do DOS.A interrupo 10h contm os servios da placa de vdeo.No final da Int as flags so desempilhadas.

    INT 21h, 09h (Print String )

    Entrada: Ah = 09hDs:Dx = Ponteiro para a string

    Retorna: NadaObservao: A string deve ser terminada por um $

    INT 21h, 4Ch (Terminate a Process , Exit )

    12 - 12 -

  • Entrada: Ah = 4Ch Al = Return code

    Retorna: Nada Fecha todos os arquivos e retorna o controle ao chamador, liberando o espao de

    memria usado para o DOS. a maneira correta de se encerrar um programa em DOS (2.0 ou superior). O Return Code pode ser testado atravs da varivel de sistema errorlevel.

    END Indica o fim de um mdulo.Sintaxe: End [expresso]expresso indica o ponto de entrada do programa

    DB e DW (Define Byte e Define Word) Aloca e inicializa um ou mais bytes de memria.Sintaxe: [nome] Db valor,valor2,...,...nome cria uma varivel quando especificadovalor pode ser:

    Tipo ExemploInteiro 5String mensagemConstante 2*5Operador DUP 10 DUP (?)Interrogao ?

    Observao: Uma word no pode receber um byte e vice-versa.

    DUP (Duplicate)

    Sintaxe: num Dup (valor,...,...)Lgica: Repete os valores especificados num vezesExemplo:Db 200 Dup (1) ; 200 bytes inicializados com 1Db 50 Dup (1,0) ; 100 bytes inicializados com 1 e 0

    13 - 13 -

  • STACK (Segment Stack)

    Sintaxe: nome_seg Segment Stack Define um segmento de pilha. Os endereos neste segmento esto associados ao registrador SS.

    Observaes: Chamadas uma interrupo usam pilha, portanto, ateno para a existncia da pilha

    quando usar Int. O caracter ; indica ao compilador que a partir da a linha apenas comentrio. As tabelas de exemplo sempre mostram todos os tipos aceitos pela instruo.

    Hello.asm Code_Seg Segment Assume CS:Code_Seg, DS:Data_SegHello Proc Far Mov Ax, Data_Seg Mov Ds, Ax

    Lea Dx, Msg Mov Ah,09 Int 21h Mov Ah,4Ch Int 21hHello Endp

    Code_Seg Ends

    Data_Seg Segment Msg Db 'Hello Assembly !$'Data_Seg Ends

    Stack_Seg SEGMENT STACK db 10 Dup('Pilha ')Stack_Seg Ends

    End Hello

    14 - 14 -

  • O PROGRAMA HELLO 2CALL Chama uma procedure.Sintaxe: Call nome_procedureLgica:Se Far Call{ Empilha CS

    CS segmento destino }Empilha IPIP deslocamento destino

    RET (Return) Retorna de uma chamada de uma procedure. Comando obrigatrio para retorno em Assembly.Sintaxe: Ret [valor]Lgica:Desempilha IPSe RET Far{ Desempilha CS }[SP SP + valor]

    PUSH Empilha uma wordSintaxe: Push origemLgica:SP SP 2(SP) origem

    Operaes ExemploReg PUSH BX

    Memria PUSH VarReg_Seg (exceto IP) PUSH ES

    POP Desempilha uma wordSintaxe: Pop destinoLgica:destino (SP)SP SP + 2

    Operaes ExemploReg POP SI

    Memria POP VarReg_Seg

    (exceto CS e IP)POP DS

    15 - 15 -

  • XOR (Ou Exclusivo)

    Sintaxe: Xor destino, origemLgica: destino destino xor origem (bit a bit)Flags: O D I T S Z A P C

    0 * * * * 0

    Tabela Verdade:Destino Origem Resultado

    0 0 00 1 11 0 11 1 0

    Operaes e Exemplos:

    Operao Exemploregistrador, registrador Xor Bx, Cxregistrador, memria Xor Cl, varmemria, registrador Xor var, Dxacumulador, imediato Xor Al, 10101111bregistrador, imediato Xor Si, 0CAhmemria, imediato Xor var, 3

    Observao: Pode ser usado para zerar um registrador ou uma varivel (exemplo: Xor Cx, Cx),

    tendo o mesmo efeito que mover zero, porm, com menos ciclos de mquina.

    SUB (Subtract) Sintaxe: Sub destino, origemLgica: destino destino origemFlags: O D I T S Z A P C

    * * * * * *

    Operaes e Exemplos:

    Operao Exemploregistrador, registrador Sub Dx, Bxregistrador, memria Sub Bx, varmemria, registrador Sub var, Siacumulador, imediato Sub Al, 5registrador, imediato Sub Dx, 3memria, imediato Sub var, 0Fh

    ADD Sintaxe: Add destino, origemLgica: destino destino + origemFlags: O D I T S Z A P C

    * * * * * *

    Operaes e Exemplos:

    Operao Exemploregistrador, registrador Add Dx, Bxregistrador, memria Add Bx, varmemria, registrador Add var, Siacumulador, imediato Add Al, 5registrador, imediato Add Dx, 3memria, imediato Add var, 0Fh

    16 - 16 -

  • SHR (Shift Right) Sintaxe: Shr destino, quantidade Desloca os bits do destino para a

    direita, o registrador CF recebe o bit de menor ordem e o bit de maior ordem recebe valor 0.

    Lgica: 0 destino CFFlags: O D I T S Z A P C

    * * * ? * *Operaes e Exemplos:

    Operao Exemploregistrador, 1 SHR SI, 1registrador, CL SHR BX, CLmemria, 1 SHR Var, 1memria, CL SHR Var, CL

    SHL (Shift Left) Sintaxe: Shl destino, quantidade Desloca os bits do destino para a

    esquerda, o registrador CF recebe o bit de maior ordem e o bit de menor ordem recebe valor 0.

    Lgica: CF destino 0Flags: O D I T S Z A P C

    * * * ? * *Operaes e Exemplos:

    Operao Exemploregistrador, 1 SHL SI, 1registrador, CL SHL BX, CLmemria, 1 SHL Var, 1memria, CL SHL Var, CL

    Observaes: O nico valor imediato que pode ser usado 1. Para deslocar mais de um bit de uma

    nica vez necessrio usar o registrador Cl com o total de bits a serem deslocados. Usados para multiplicao e diviso por potncias de 2. Em ambos a OF (overflow flag) setada se houver uma troca de sinal, ou seja, se o bit

    de mais alta ordem trocou pois nmeros com sinal so guardados em complemento a 2. No caso de rotao de mais de um bit, CF fica com o valor do ltimo rotacionado.

    INT 10h, 06h (Scroll Window Up ) Entrada:Ah 06hAl Nmero de linhas a rolar ou

    0 para limpar a regioBh Atributo para novas linhas

    Ch Linha superiorCl Coluna esquerdaDh Linha inferiorDl Coluna direita

    Retorna: nadaObservaes: Int 10h, 07h (Scroll Window Down) tem as mesmas entradas. Pode ser usada para limpar toda a tela.

    INT 10h, 0Fh (Get Current Video Mode )

    17 - 17 -

  • Entrada: Ah 0Fh Retorna: Al Modo de vdeoAh Nmero de caracteres por linhaBh Pgina de vdeo ativa

    INT 10h, 02h (Set Cursor Position )

    Entrada:Ah 02hBh Pgina de vdeo

    Dh linhaDl coluna

    Retorna: nada

    INT 21h, 08h (Console Input Without Echo )

    Entrada:Ah 08h

    Retorna:Al char

    Observao: TECLA ESPECIAL: Se a tecla for especial (exemplo: F1) Al retornar 0. Para pegar o

    cdigo da tecla especial tem que ser chamada uma nova int 21h, 08h.

    Observaes: O nmero dos servios de interrupo dever estar sempre no Ah. Usar Xor para zerar, Shr para dividir por 2 e Shl para multiplicar por 2 so maneiras

    de se programar economizando ciclos de mquina. Se voc pretende fazer com que sua rotina salve no incio os registradores usados e os

    restaure no final, lembre-se de que existem registradores que so usados como retorno de valores de uma interrupo.

    A rotina Encontra_Pos do programa Hello2 pode ser otimizada! Push mais rpido que salvar usando Mov. Int 10h a interrupo de vdeo (pertence ao grupo de interrupes da Bios).

    18 - 18 -

  • Hello2.asm Code_Seg Segment Assume Cs:Code_Seg, Ds:Data_Seg

    Hello2 Proc Near Mov Ax, Data_Seg Mov Ds, Ax Call Limpa_Tela Call Encontra_Pos Call Say_Hello Call Espera_Tecla Call Limpa_Tela Mov Ah,4Ch Mov Al,00 Int 21hHello2 Endp

    Limpa_Tela Proc Near Push Ax Push Bx Push Cx Push Dx Mov Ax,0600h Mov Bh,07 Xor Cx,Cx Mov Dh,24 Mov Dl,79 Int 10h Pop Dx Pop Cx Pop Bx Pop Ax RetLimpa_Tela EndP

    Encontra_Pos Proc Near Push Ax Push Bx Mov Ah,0Fh Int 10h Mov X,Ah Sub X,17 Shr X,1 Pop Bx

    Pop Ax RetEncontra_Pos Endp

    Say_hello Proc Near Push Ax Push Dx Call SetCursor Mov Ah,09 Lea Dx,Msg Int 21h Pop Dx Pop Ax RetSay_hello EndP

    SetCursor Proc Near Push Ax Push Bx Push Dx Xor Bh,Bh Mov Ah,02 Mov Dh,Y Mov Dl,X Int 10h Pop Dx Pop Bx Pop Ax RetSetCursor Endp

    Espera_Tecla Proc Near Push Ax Mov Ah,08 Int 21h Pop Ax RetEspera_Tecla Endp

    Code_Seg Ends

    Data_Seg Segment Msg Db 'Hello Assembler !$' X Db ?

    19 - 19 -

  • Y Db 12Data_Seg Ends

    Stack_Seg SEGMENT STACK

    db 10 Dup(' ')Stack_Seg Ends

    End Hello2

    O PROGRAMA TECLARtulo : Sintaxe: nome_rotulo: Diretiva de compilao que marca uma posio dentro do cdigo. Toda vez que o compilador encontrar o nome do rtulo ele ir substituir pelo endereo

    onde se encontra o rtulo (deslocamento).

    CMP (Compare) Sintaxe: Cmp destino, origem

    Lgica:Flags setadas de acordo com o resultado de: destino origem

    Flags: O D I T S Z A P C* * * * * *

    Operaes e Exemplos:

    Operao ExemploRegistrador, registrador Cmp Cx, BxRegistrador, imediato Cmp Si, 3Acumulador, imediato Cmp Al, 0FhRegistrador, memria Cmp Bx, varMemria, registrador Cmp var, CxMemria, imediato Cmp var, 8

    JB (Jump if Below) Sintaxe: Jb rtuloLgica:Se CF (carry flag) = 1

    Salta para rtuloObservao:JB = JC (Jump if Carry) = JNAE (Jump if Not Above or Equal)

    JA (Jump if Above) Sintaxe: Ja rtuloLgica:Se CF (carry flag) = 0 && ZF (zero flag) = 0

    Salta para rtuloObservao:JA = JNBE (Jump if Not Below or Equal)

    JMP (Jump) Salto incondicionalSintaxe: Jmp rtuloLgica: Salta para rtulo

    20 - 20 -

  • Observao: O Salto pode ser longo, inclusive para outros segmentos.

    INC (Increment) Sintaxe: Inc destinoLgica: destino destino + 1Flags: O D I T S Z A P C

    * * * * *

    Operaes e Exemplos:

    Operao Exemploregistrador 16 bits Inc BxRegistrador 8 bits Inc ClMemria Inc var

    Observao: Para decrementar use o comando DEC, cuja sintaxe a mesma de INC.

    LOOP Sintaxe: Loop rtuloLgica:

    Cx Cx 1Se ( Cx != 0 )

    Jmp rtulo Observao: Se Cx = 0 no incio sero feitos

    65.536 loops.

    LABEL Cria um rtulo ou varSintaxe: nome label tipoObservao: tipo pode ser:

    byte, word, dword, etc. near, far

    Exemplo:Byte_buffer label byteWord_buffer dw 512 dup (?)

    INT 21h, 0Ah (Buffer Input ) L os caracteres, ecoando-os na tela se o tamanho mximo ainda no tiver estourado,

    at que seja pressionado.Entrada:Ah 0AhDs:Dx ponteiro para bufferoffset 0 do buffer tamanho mximo do buffer + 1Retorna:offset 1 do buffer nmero de caracteres efetivamente lidos (sem contar o )offset 2 do buffer em diante caracteres lidos incluindo o CR (Carriage Return = )Observao: No l teclas de funo. Edio rudimentar. Dados s podem ser criticados ao final.

    21 - 21 -

  • Quando o limite de caracteres a serem lidos estoura, o beep toca.

    INT 21h, 02h (Char Output ) Imprime o caracter ou o executa, se for do tipo beep, line feed ou assemelhados.Entrada:Ah 02hDl caracter

    Observaes: Os jumps condicionais (Jb, Jae, etc.) tm um limite de 127 bytes de distncia at o

    rtulo. O Jmp no tem limite (pode ser inclusive em outro segmento), portanto para dar um salto condicional maior que 127 bytes usa-se comumente um recurso denominado trampolim, que o uso de um jump condicional apontando para um Jmp (incondicional) para que a distncia do rtulo seja vencida.

    Offset = deslocamento. Deslocamento tambm pode ser representado em assembly pela presena de colchetes. Exemplo: var[3]

    Ja e Jb so usados para nmeros positivos; para nmeros com sinal use JG (Jump if Greater) e JL (Jump if Less).

    O comando if de C em Assembly a juno do CMP com um jump condicional. O camando for de C em Assembly o comando Loop que repete um bloco Cx

    vezes. Ao usar o Loop devemos estar atentos quanto a alteraes em Cx para no atrapalhar o

    controle de repetio. Os jumps condicionais devem estar imediatamente aps o Cmp, porque outras

    instrues podem alterar o resultado das flags. Os nicos registradores que podem ser usados como indexadores de memria so: Bx,

    Si e Di. Exemplo: var[Bx] O assembly permite que voc faa jumps para uma procedure, no entanto no se deve

    fazer uso deste recurso por dois motivos: 1) O Ret no ir funcionar, pois ele espera encontrar na pilha o endereo de retorno que empilhado pelo Call, os jumps no empilham endereo. 2) Mesmo que voc resolva o problema anterior, ao fazer jumps para procedures voc estar perdendo a estruturao do seu programa e portanto sua qualidade. Para chamar uma procedure use apenas o comando Call.

    22 - 22 -

  • Tecla.asm Code_Seg Segment Assume Cs:Code_Seg, Ds:Data_Seg

    Tecla Proc Near Mov Ax, Data_Seg Mov Ds, Ax Call Le_Texto Call Conv_Maiuscula Mov Ah,4Ch Int 21hTecla Endp

    Le_Texto Proc Near Push Ax Push DX Lea Dx, Texto Mov Ah,0Ah Int 21h Pop Dx Pop Ax RetLe_Texto Endp

    Conv_Maiuscula Proc Near Push Ax Push Bx Push Cx Xor Ch,Ch Mov Cl,Car_Lidos Lea Bx,StringLoop_Conversao: Mov Al,[Bx] Cmp Al,'a' Jb Prox_Byte Cmp Al,'z' Ja Prox_Byte Sub Al,20h Mov [Bx],Al

    Prox_Byte: Inc Bx Loop Loop_Conversao Pop Cx Pop Bx Pop Ax RetConv_Maiuscula EndP

    Code_Seg Ends

    Data_Seg Segment

    Texto Label Byte Tam_String Db 31 Car_Lidos Db 0 String Db 31 Dup(' ')

    Data_Seg Ends

    Stack_Seg SEGMENT STACK db 10 Dup('Pilha ')Stack_Seg Ends

    End Tecla

    23 - 23 -

  • O PROGRAMA IMPBIN

    JE (Jump if Equal) Sintaxe: Je rtuloLgica:Se ZF (Zero flag) = 1

    Salta para rtulo

    Observaes: JE = JZ (Jump if Zero). JNE (Jump if Not Equal) teste para o

    salto inverso do JE.

    OR Ou lgicoSintaxe: Or destino, origemLgica: destino destino or origem

    (bit a bit)Flags: O D I T S Z A P C

    0 * * ? * 0

    Tabela Verdade:Destino Origem Resultado

    0 0 00 1 11 0 11 1 1

    Operaes e Exemplos: Vide Xor na pgina 15.Observaes: Por gastar menos ciclos de mquina

    que o Cmp, usado para comparar com 0: Or x,x

    Existe tambm a operao lgica AND, cuja tabela verdade :

    Destino Origem Resultado0 0 00 1 01 0 01 1 1

    Existe ainda a operao NOT, cuja sintaxe s tem destino (sem origem).

    ADC (Add With Carry) Sintaxe: Adc destino, origemLgica: destino destino + origem + CF

    24 - 24 -

  • CLC (Clear Carry Flag) Sintaxe: CLCLgica: CF 0Flags: O D I T S Z A P C

    0

    Observao: As flags DF e IF tambm podem ser

    zeradas atravs das instrues: CLD e CLI, respectivamente.(Ex: CLD Clear Direction Flag)

    STC (Set Carry Flag) Sintaxe: STCLgica: CF 1Flags: O D I T S Z A P C

    1

    Observao: As flags DF e IF tambm podem ser

    setadas (receberem valor 1) atravs das instrues: STD e STI, respectivamente.(Ex: STI Set Interruption Flag)

    RCL (Rotate Through Carry Left) Sintaxe: RCL destino, quantidadeLgica: CF destino

    Flags: O D I T S Z A P C* *

    Operaes e Exemplos:

    Operao Exemploregistrador, 1 RCL AX, 1registrador, CL RCL BX, CLmemria, 1 RCL Var, 1memria, CL RCL Var, CL

    Observao: Assim como existem o SHR e o SHL, tambm existe o RCR (Rotate Through Carry

    Right).

    Observao: O comando Push no pode ser usado para empilhar vrios registradores ao mesmo

    tempo. Apenas por uma questo de melhor visualizao e aproveitamento do espao usaremos em algumas das listagens dos programas: Push Ax, Bx, Cx.

    25 - 25 -

  • Impbin.asm Code_Seg Segment Assume Cs:Code_Seg, Ds:Data_SegHexa_Bin Proc Near Mov Ax, Data_Seg Mov Ds, AxLoop_Texto: Call Le_Texto Call Conv_Maiuscula Call Valida_Texto Jc Loop_Texto Call Imp_Bin Mov Ah,4Ch Int 21hHexa_Bin Endp

    Le_Texto Proc Near Push Ax,Dx Lea Dx, TextoLoop_Leitura: Mov Ah,0Ah Int 21h Cmp Car_Lidos,0 Je Loop_Leitura Pop Dx,Ax RetLe_Texto Endp

    Conv_Maiuscula Proc Near;idem tecla.asmConv_Maiuscula EndP

    Valida_Texto Proc Near Push Ax,Cx Mov Al,String[0] Cmp Al,'0' Jb Erro_Digito Cmp Al,'9' Ja Tenta_Letra Sub Al,'0' Mov Ah,Al Jmp Segundo_DigitoTenta_Letra: Cmp Al,'A' Jb Erro_Digito Cmp Al,'F' Ja Erro_Digito Sub Al,'A'-10 Mov Ah,AlSegundo_Digito: Cmp Car_Lidos,2 Jb Fim_Digitos Mov Al,String[1] Cmp Al,'0'

    Jb Erro_Digito Cmp Al,'9' Ja Tenta_Letra2 Sub Al,'0' Jmp Acerta_NumTenta_Letra2: Cmp Al,'A' Jb Erro_Digito Cmp Al,'F' Ja Erro_Digito Sub Al,'A'-10Acerta_Num: Mov Cx,4 Shl Ah,Cl Or Ah,Al Mov Dig_Hexa,Ah Clc Jmp Fim_ValidaErro_Digito: Stc Jmp Fim_ValidaFim_Digitos: Clc Mov Dig_Hexa,AlFim_Valida: Pop Cx,Ax RetValida_Texto Endp

    Imp_Bin Proc Near Push Ax,Bx,Cx,Dx Mov Ah,02 Mov Bl,Dig_Hexa Mov Cx,8Loop_ImpBin: Mov Dl,0 Rcl Bl,1 Adc Dl,'0' Int 21h Loop Loop_ImpBin Pop Dx,Cx,Bx,Ax RetImp_Bin EndpCode_Seg Ends

    Data_Seg Segment Texto Label Byte Tam_String Db 3 Car_Lidos Db 0 String Db 3 Dup(' ') Dig_Hexa Db ?Data_Seg EndsStack_Seg SEGMENT STACK db 10 Dup('Pilha ')Stack_Seg EndsEnd Hexa_Bin

  • MUL, DIV E EXERCCIOSMUL (Multiply) Multiplicao sem sinalSintaxe: Mul origemLgica:Se (origem == byte)

    AX = origem * AL Se (origem == word)

    DX:AX = origem * AX

    Flags: O D I T S Z A P C* ? ? ? ? *

    Operaes e Exemplos:

    Operando Exemploimediato MUL 20

    reg8 MUL CH reg16 MUL BX mem8 MUL VarByte mem16 MUL VarWord

    DIV (Divide) Diviso sem sinalSintaxe: Div origemLgica:Se (origem == byte)

    AL = AX / origemAH = resto

    Se (origem == 27ord)AX = DX:AX / origem DX = resto

    Flags: O D I T S Z A P C? ? ? ? ? ?

    Operaes e Exemplos:

    Operando Exemploimediato DIV 16

    reg8 DIV BL reg16 DIV BX mem8 DIV VarByte mem16 DIV VarWord

    27 - 27 -

  • Observaes: Para nmeros com sinal use as instrues IMUL e IDIV. Se o resultado da diviso no couber gerada a interrupo de diviso por 0.

    Exerccios:1) Faa uma rotina em Assembly que troque o valor do registrador AH com o valor do registrador BH utilizando apenas instrues lgicas: AND, OR ou XOR. Voc pode utilizar outros registradores para guardar valores intermedirios.2) Faa uma rotina em Assembly que retorne em AX o maior valor de uma regio na

    memria. A regio dever ser referenciada pela varivel Tabela (tipo byte) que ter um tamanho fixo de 256 bytes. Tabela estar definida da seguinte forma:

    Tabela db 0,4,0,7,255,4,3,..........., 200.3) Faa um programa completo em Assembly que leia 5 algarismos. Para cada algarismo

    lido deve ser mostrado o caracter * ao invs do prprio algarismo. Caso o usurio digite algo diferente de algarismos o programa deve emitir um bell. Ao final da digitao o programa mostrar ento quais foram os algarismos inseridos.

    NDICE ALFABTICO:AADC........................................24ADD.......................................16AND.......................................24ASSUME................................11

    BBuffer Input............................21

    CCALL......................................15Char Output............................22CLC, CLD, CLI......................25CMP........................................20Console Input Without Echo. .18

    DDB / DW.................................13DEC........................................21DIV.........................................27DUP........................................13

    EEND........................................13ENDP......................................11ENDS......................................11Exit.........................................12

    GGet Current Video Mode........17

    HHello.asm................................14Hello2.asm..............................19

    IImpbin.asm.............................26INC.........................................21

    INT.........................................12INT 10h, 02h.....................18INT 10h, 06h.....................17INT 10h, 0Fh.....................17INT 21h, 02h.....................22INT 21h, 08h.....................18INT 21h, 09h.....................12INT 21h, 0Ah....................21INT 21h, 4Ch....................12

    JJA, JNBE................................20JB, JC, JNAE..........................20JE, JZ......................................24JMP.........................................20JNE.........................................24

    LLABEL...................................21LEA........................................11LOOP......................................21

    MMOV.......................................12MUL.......................................27

    NNOT........................................24

    OOR..........................................24

    PPOP.........................................15Print String.............................12PROC......................................11PUSH......................................15

    RRCL........................................25RCR........................................25RET........................................15Rtulo.....................................20

    SScroll Window Up..................17SEGMENT.............................11Set Cursor Position.................18SHL........................................17SHR........................................17STACK...................................14STC, STD, STI.......................25SUB........................................16

    TTecla.asm................................23Terminate a Process...............12

    XXOR........................................16

    28 - 28 -

  • AGRADECIMENTOS:Gostaria de agradecer ao professor Carlos Fersura, que foi meu professor de Assembly no segundo perodo de 1993. Ele me convidou para ser seu monitor (funo que exerci por dois anos), me indicou como seu substituto na funo de professor e hoje meu afilhado de casamento. O Carlos na verdade o criador dos programas exemplos e das estruturas das aulas.

    29 - 29 -

    DEASSEMBLYRevisando Conceitos e Sistemas de NumeraoArquitetura Interna do 808806O Programa Hello10O Programa Hello214O Programa Tecla19O Programa Impbin23Mul, Div e Exerccios26