Kip R. Irvine Capítulo 7: Aritmética de Inteiros Slides prepared by the author Revision date: June 4, 2006 (c) Pearson Education, 2006-2007. All rights reserved. You may modify and copy this slide show for your personal use, or for use in the classroom, as long as this copyright statement, the author's name, and the title are not changed. Web site Examples Índice       Instruções de Shift e Rotate Aplicações de Shift e Rotate Instruções de Multiplicação e Divisão Adição e subtração estendida Aritmética ASCII e decimal desempacotado Aritmética decimal empacotado Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 2 Instruções de Shift e Rotate         Shift Lógico vs Aritmético Instrução SHL Instrução SHR Instruções SAL e SAR Instrução ROL Instrução ROR Instruções RCL e RCR Instruções SHLD/SHRD Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 3 Shift lógico vs. aritmético  O shift lógico preenche as lacunas criadas com zero: 0 CF • O shift aritmético preenche as lacunas criadas com a cópia do bit de sinal: CF Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 4 Instrução SHL  A instrução SHL (shift left) faz o deslocamento lógico à esquerda do operando destino, preenchendo o bit à direita com 0. 0 CF • Tipos de operando para SHL: SHL reg,imm8 SHL mem,imm8 SHL reg,CL SHL mem,CL (mesmos para todas as instruções shift e rotate) Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 5 Fast Multiplication Deslocando 1 bit à esquerda multiplica um número por 2 mov dl,5 shl dl,1 Before: 00000101 =5 After: 00001010 = 10 Deslocando à esquerda n bits multiplica o operando por 2n Exemplo, 5 * 22 = 20 mov dl,5 shl dl,2 ; DL = 20 Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 6 Instrução SHR  A instrução SHR (shift right) faz o deslocamento lógico à direita do operando destino. A posição do bit mais significativo é preenchido com zero. 0 CF Deslocando n bits à direita divide o operando por 2n mov dl,80 shr dl,1 shr dl,2 Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. ; DL = 40 ; DL = 10 Web site Examples 7 Instruções SAL e SAR  SAL (shift arithmetic left) é idêntico a SHL.  SAR (shift arithmetic right) faz um deslocamento aritmético à direita no operando destino. CF Um shift aritmético preserva o sinal do número. mov dl,-80 sar dl,1 sar dl,2 Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. ; DL = -40 ; DL = -10 Web site Examples 8 Sua vez . . . Indicar o valor em hexadecimal de AL após cada shift: mov shr shl mov sar sar al,6Bh al,1 al,3 al,8Ch al,1 al,3 a. 35h b. A8h c. C6h d. F8h Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 9 Instrução ROL  ROL (rotate) desloca cada bit à esquerda  O bit mais significativo é copiado no flag Carry e no bit menos significativo  Nenhum bit é perdido CF mov al,11110000b rol al,1 ; AL = 11100001b mov dl,3Fh rol dl,4 ; DL = F3h Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 10 Instrução ROR  ROR (rotate right) desloca cada bit à direita  O bit menos significativo é copiado no flag Carry e na posição do bit mais significativo  Nenhum bit é perdido CF mov al,11110000b ror al,1 ; AL = 01111000b mov dl,3Fh ror dl,4 ; DL = F3h Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 11 Sua vez . . . Indicar o valor hexadecimal de AL após cada rotação: mov al,6Bh ror al,1 rol al,3 a. B5h b. ADh Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 12 Instrução RCL  RCL (rotate carry left) desloca cada it à esquerda  Copia o Carry flag para a posição menos significativa  Copia o bit mais significativo no flag Carry CF clc mov bl,88h rcl bl,1 rcl bl,1 ; ; ; ; CF = 0 CF,BL = 0 10001000b CF,BL = 1 00010000b CF,BL = 0 00100001b Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 13 Instrução RCR  RCR (rotate carry right) desloca cada bit à direita  Copia o flag Carry na posição mais significativa  Copia o bit menos significativo no flag Carry CF stc mov ah,10h rcr ah,1 ; CF = 1 ; CF,AH = 1 00010000b ; CF,AH = 0 10001000b Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 14 Sua vez . . . Indicar o valor hexadecimal de AL após cada rotação: stc mov al,6Bh rcr al,1 rcl al,3 a. B5h b. AEh Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 15 Instrução SHLD  Desloca o operando destino um dado número de bits à esquerda  As posições vazias resultantes são preenchidas pelos bits mais significativos do operando fonte  O operando fonte não é afetado  Sintaxe: SHLD destination, source, count  Tipos de operando: SHLD reg16/32, reg16/32, imm8/CL SHLD mem16/32, reg16/32, imm8/CL Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 16 Exemplo de SHLD Desloca wval 4 bits à esquerda e substitui os 4 bits menos significativos com os 4 bits mais significativos de AX: .data wval WORD 9BA6h .code mov ax,0AC36h shld wval,ax,4 wval AX Before: 9BA6 AC36 After: BA6A AC36 Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 17 Instrução SHRD  Desloca o operando destino um dado número de bits à direita  As posições vazias resultantes são preenchidas com os bits menos significativos do operando fonte  O operando fonte não é afetado  Sintaxe: SHRD destination, source, count  Tipos de operando: SHRD reg16/32, reg16/32, imm8/CL SHRD mem16/32, reg16/32, imm8/CL Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 18 Exemplo de SHRD Desloca AX 4 bits à direita e substitui os 4 bits mais significativos com os 4 bits menos significativos de DX: mov ax,234Bh mov dx,7654h shrd ax,dx,4 DX AX Before: 7654 234B After: 7654 4234 Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 19 Sua vez . . . Indicar em valor hexadecimal cada operando destino: mov mov shld shrd ax,7C36h dx,9FA6h dx,ax,4 dx,ax,8 ; DX = FA67h ; DX = 36FAh Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 20 Próxima seção       Instruções de Shift e Rotate Aplicações de Shift e Rotate Instruções de Multiplicação e Divisão Adição e subtração estendida Aritmética ASCII e decimal desempacotado Aritmética decimal empacotado Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 21 Aplicações de Shift e Rotate  Deslocando Doublewords múltiplos  Multiplicação binária  Mostrando bits binários  Isolando uma cadeia de bits Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 22 Deslocando Doublewords múltiplos  Os programas às vezes precisam deslocar todos os bits de um vetor, como o movimento de uma imagem gráfica de uma posição da tela para outra.  O seguinte programa desloca um vetor de 3 doublewords 1 bit à direita: .data ArraySize = 3 array DWORD ArraySize DUP(99999999h) ; 1001 1001... .code mov esi,0 shr array[esi + 8],1 ; high dword rcr array[esi + 4],1 ; middle dword, include Carry rcr array[esi],1 ; low dword, include Carry Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 23 Multiplicação binária  Sabemos que SHL faz a multiplicação sem sinal quando o multiplicador é potência de 2.  É possível fatorar qualquer número binário em potência de 2.  Por exemplo, para multiplicar EAX * 36, fatorar 36 em 32 + 4 e usar a propriedade distributiva de multiplicação : EAX * 36 = EAX * (32 + 4) = (EAX * 32)+(EAX * 4) mov mov shl shl add eax,123 ebx,eax eax,5 ebx,2 eax,ebx Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site ; mult by 25 ; mult by 22 Examples 24 Sua vez . . . Multiplicar AX por 26, usando deslocamento e adição. Dica: 26 = 16 + 8 + 2. mov ax,2 mov dx,ax shl dx,4 push dx mov dx,ax shl dx,3 shl ax,1 add ax,dx pop dx add ax,dx ; test value ; AX * 16 ; save for later ; ; ; ; ; AX * 8 AX * 2 AX * 10 recall AX * 16 AX * 26 Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 25 Mostrando bits binários Algoritmo: deslocar o MSB para o flag Carry; se CF = 1, anexar o caractere "1“ à cadeia; caso contrário, anexar o caractere “0” . Repetir em loop, 32 vezes. .data buffer BYTE 32 DUP(0),0 .code mov ecx,32 mov esi,OFFSET buffer L1: shl eax,1 mov BYTE PTR [esi],'0' jnc L2 mov BYTE PTR [esi],'1' L2: inc esi loop L1 Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 26 Isolando uma cadeia de bits  O campo de data do arquivo MS-DOS empacota o ano, mês e dia em 16 bits: DH DL 0 0 1 0 0 1 1 0 Field: Bit numbers: Year 9-15 0 1 1 0 1 0 1 0 Month 5-8 Day 0-4 Isolar o campo mês: mov shr and mov ax,dx ax,5 al,00001111b month,al ; ; ; ; Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. make a copy of DX shift right 5 bits clear bits 4-7 save in month variable Web site Examples 27 Próxima seção       Instruções de Shift e Rotate Aplicações de Shift e Rotate Instruções de Multiplicação e Divisão Adição e subtração estendida Aritmética ASCII e decimal desempacotado Aritmética decimal empacotado Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 28 28 Instruções de Multiplicação e Divisão  Instrução MUL  Instrução IMUL  Instrução DIV  Divisão inteira com sinal  Instruções CBW, CWD, CDQ  Instrução IDIV  Implementando expressões Aritméticas Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 29 Instrução MUL  A instrução MUL (unsigned multiply) multiplica um operando de 8-, 16-, ou 32-bit por AL, AX, ou EAX.  Os formatos são: MUL r/m8 MUL r/m16 MUL r/m32 Operandos implícitos: Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 30 Exemplos de MUL 100h * 2000h, usando operandos de 16-bits: .data val1 WORD 2000h val2 WORD 100h .code mov ax,val1 mul val2 ; DX:AX = 00200000h, CF=1 O flag Carry indica se a metade superior contem dígitos significativos 12345h * 1000h, usando operandos de 32-bits: mov eax,12345h mov ebx,1000h mul ebx ; EDX:EAX = 0000000012345000h, CF=0 Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 31 Sua vez . . . Quais seriam os valores em hexadecimal de DX, AX, e flag Carry após a execução das instruções seguintes? mov ax,1234h mov bx,100h mul bx DX = 0012h, AX = 3400h, CF = 1 Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 32 Sua vez. . . Quais serão os valores em hexadecimal de EDX, EAX, e flag Carry após a execução das seguintes instruções? mov eax,00128765h mov ecx,10000h mul ecx EDX = 00000012h, EAX = 87650000h, CF = 1 Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 33 Instrução IMUL  IMUL (signed integer multiply ) multiplica um operando com sinal de 8-, 16-, ou 32-bits por AL, AX, ou EAX  Preserva o sinal do produto estendendo o sinal para o registrador destino da metade mais significativa Exemplo: multiplicar 48 * 4, usando operandos de 8-bits : mov al,48 mov bl,4 imul bl ; AX = 00C0h, OF=1 OF=1 porque AH recebe bits significativos, não somente extensão de sinal de AL. Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 34 Exemplos de IMUL Multiplicar 4,823,424 * -423: mov eax,4823424 mov ebx,-423 imul ebx ; EDX:EAX = FFFFFFFF86635D80h, OF=0 OF=0 porque EDX é somente extensão de sinal de EAX. Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 35 Sua vez . . . Quais serão os valores hexadecimal de DX, AX, flag Carry e overflow flag após a execução das seguintes instruções? mov ax,8760h mov bx,100h imul bx DX = FF87h, AX = 6000h, CF=1, OF = 1 Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 36 Instrução DIV (sem sinal)  A instrução DIV faz a divisão de 8-bit, 16-bit, e 32-bits em inteiros sem sinal  O divisor é o único operando explícito (registrador ou memória) Operandos Default:  Formatos: DIV r/m8 DIV r/m16 DIV r/m32 Web site Examples 37 Exemplos de DIV Dividir 8003h por 100h, usando operandos de 16-bits: mov mov mov div dx,0 ax,8003h cx,100h cx ; ; ; ; clear dividend, high dividend, low divisor AX = 0080h, DX = 3 Mesma divisão, usando operandos de 32-bits: mov mov mov div edx,0 eax,8003h ecx,100h ecx ; ; ; ; clear dividend, high dividend, low divisor EAX = 00000080h, EDX = 3 Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 38 Sua vez . . . Quais os valores em hexadecimal de DX e AX após a execução das seguintes instruções? Ou, indicar se ocorre divide overflow: mov mov mov div dx,0087h ax,6000h bx,100h bx DX = 0000h, AX = 8760h Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 39 Sua vez . . . Quais os valores em hexadecimal de DX e AX após a execução das seguintes instruções? Ou, indicar se ocorrer divide overflow: mov mov mov div dx,0087h ax,6002h bx,10h bx Divide Overflow Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 40 IDIV - Divisão inteira com sinal  Os inteiros com sinal devem ser estendidos em sinal antes da divisão ser realizada  Preencher os byte/word/doubleword mais significativos com uma cópia do bit de sinal do byte/word/doubleword menos significativo  Por exemplo, o byte mais significativo contem uma cópia do bit de sinal do byte menos significativo: 10001111 11111111 10001111 Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 41 Instruções CBW, CWD, CDQ  As instruções CBW, CWD e CDQ realizam importantes operações de extensão de sinal:  CBW (convert byte to word) estende AL para AH  CWD (convert word to doubleword) estende AX para DX  CDQ (convert doubleword to quadword) estende EAX para EDX  Exemplo: mov eax,0FFFFFF9Bh ; (-101) cdq ; EDX:EAX = FFFFFFFFFFFFFF9Bh Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 42 Instrução IDIV  IDIV faz a divisão de inteiro com sinal  Mesma sintaxe e operandos como na instrução DIV Exemplo: divisão de 8-bits de –48 por 5 mov al,-48 cbw mov bl,5 idiv bl ; extend AL into AH ; AL = -9, Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. AH = -3 Web site Examples 43 Exemplos de IDIV Exemplo: divisão de 16-bits de –48 por 5 mov ax,-48 cwd mov bx,5 idiv bx ; extend AX into DX ; AX = -9, DX = -3 Exemplo: divisão de 32-bits de –48 por 5 mov eax,-48 cdq mov ebx,5 idiv ebx ; extend EAX into EDX ; EAX = -9, Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. EDX = -3 Web site Examples 44 Sua vez . . .. Quais os valores em hexadecimal de DX e AX após a execução das seguintes instruções? Ou, se ocorrer divide overflow , indicar isso como resposta: mov ax,0FDFFh cwd mov bx,100h idiv bx ; -513 DX = FFFFh (-1), AX = FFFEh (-2) Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 45 Expressões aritméticas sem sinal  Algumas boas razões para aprender expressões de inteiros:  Aprender como compiladores as fazem  Testar o entendimento de MUL, IMUL, DIV, IDIV  Check de overflow (flags Carry e Overflow ) Exemplo: var4 = (var1 + var2) * var3 ; Assume unsigned operands mov eax,var1 add eax,var2 ; EAX = var1 + var2 mul var3 ; EAX = EAX * var3 jc TooBig ; check for carry mov var4,eax ; save product Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 46 Expressões aritmética com sinal (1 de 2) Exemplo: eax = (-var1 * var2) + var3 mov neg imul jo add jo eax,var1 eax var2 TooBig eax,var3 TooBig ; check for overflow ; check for overflow Exemplo: var4 = (var1 * 5) / (var2 – 3) mov mov imul mov sub idiv mov eax,var1 ebx,5 ebx ebx,var2 ebx,3 ebx var4,eax Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. ; left side ; EDX:EAX = product ; right side ; EAX = quotient Web site Examples 47 Expressões aritmética com sinal (2 de 2) Exemplo : var4 = (var1 * -5) / (-var2 % var3); mov neg cdq idiv mov mov imul idiv mov eax,var2 eax var3 ebx,edx eax,-5 var1 ebx var4,eax ; begin right side ; ; ; ; ; ; ; sign-extend dividend EDX = remainder EBX = right side begin left side EDX:EAX = left side final division quotient As vezes é mais fácil calcular o termo à direita primeiro. Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 48 Sua vez . . . Implementar a seguinte expressão usando inteiros de 32 bits com sinal: eax = (ebx * 20) / ecx mov eax,20 imul ebx idiv ecx Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 49 Sua vez . . . Implementar a seguinte expressão usando inteiros de 32 bits com sinal. Salvar e restaurar EDX: eax = (ecx * edx) / eax push push mov imul pop idiv pop edx eax eax,ecx edx ebx ebx edx ; EAX needed later ; ; ; ; left side: EDX:EAX saved value of EAX EAX = quotient restore EDX Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 50 Sua vez . . . Implementar a seguinte expressão usando inteiros de 32 bits com sinal. Não modificar nenhuma variável a não ser var3: var3 = (var1 * -var2) / (var3 – ebx) mov mov neg imul mov sub idiv mov eax,var1 edx,var2 edx edx ecx,var3 ecx,ebx ecx var3,eax ; left side: EDX:EAX ; EAX = quotient Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 51 Próxima seção       Instruções de Shift e Rotate Aplicações de Shift e Rotate Instruções de Multiplicação e Divisão Adição e subtração estendida Aritmética ASCII e decimal desempacotado Aritmética decimal empacotado Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 52 52 Adição e subtração estendida  Instrução ADC  Extended Precision Addition  Instrução SBB  Extended Precision Subtraction Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 53 Adição com precisão estendida  Adicionando 2 operandos que são maiores que o tamanho máximo da palavra (32 bits).  Virtualmente não deve existir limite para o tamanho dos operandos  A aritmética deve ser realizada em etapas  O valor de Carry de uma etapa é passado para a próxima etapa. Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 54 Instrução ADC  A instrução ADC soma o operando fonte e o flag de Carry ao operando destino.  Operandos são valores binários  Mesma sintaxe do ADD, SUB, etc.  Exemplo  Somar dois inteiros de 32-bits (FFFFFFFFh + FFFFFFFFh), produzindo uma soma de 64-bit em EDX:EAX: mov mov add adc edx,0 eax,0FFFFFFFFh eax,0FFFFFFFFh edx,0 ;EDX:EAX = 00000001FFFFFFFEh Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 55 Exemplo de adição com precisão estendida  Tarefa: somar 1 a EDX:EAX  Valor inicial de EDX:EAX: 00000000FFFFFFFFh  Somar os 32 bits menos significativos primeiro, acionando o flag Carry.  Somar os 32 bits mais significativos, e incluir o flag Carry. mov mov add adc edx,0 eax,0FFFFFFFFh eax,1 edx,0 ; ; ; ; set set add add upper lower lower upper half half half half EDX:EAX = 00000001 00000000 Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 56 Instrução SBB  A instrução SBB subtrai o operando fonte e o flag Carry do operando destino.  sintaxe:  Mesmo que a instrução ADC Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 57 Exemplo de subtração estendida  Tarefa: Subtrair 1 de EDX:EAX  Valor inicial de EDX:EAX: 0000000100000000h  Subtrair os 32 bits menos significativos primeiro, acionando o flag Carry.  Subtrair os 32 bits mais significativos, incluindo o flag Carry. mov mov sub sbb edx,1 eax,0 eax,1 edx,0 ; ; ; ; set upper half set lower half subtract lower half subtract upper half EDX:EAX = 00000000 FFFFFFFF Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 58 Próxima seção       Instruções de Shift e Rotate Aplicações de Shift e Rotate Instruções de Multiplicação e Divisão Adição e subtração estendida Aritmética ASCII e decimal desempacotado Aritmética decimal empacotado Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 59 59 Aritmética ASCII e decimal empacotado  Binary Coded Decimal  ASCII  Instrução AAA  Instrução AAS  Instrução AAM  Instrução AAD  Inteiros em decimal empacotado  Instrução DAA  Instrução DAS Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 60 Binary-Coded Decimal (BCD)  Um BCD usa 4 bits para representar o dígito decimal  Um número em BCD desempacotado tem um dígito decimal na parte menos significativa dos bytes  Por exemplo, 5,678 é armazenado na seguinte seqüência de bytes mostrados em hexadecimal: 05 06 07 08 Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 61 ASCII  Nessa representação, é usado o código ASCII do número  Por exemplo, 5,678 é armazenado na seguinte seqüência de bytes mostrados em hexadecimal: 35 36 37 38 Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 62 Instrução AAA (adjust after addition)  Ajusta o resultado binário de uma instrução ADD ou ADC, em números ASCII  Torna o resultado em AL consistente com o BCD.  O valor Carry, se existir termina em AH  Para converter o resultado em ASCII fazer  or ax, 3030h  Exemplo: somar ‘8’ e ‘2’ mov mov add aaa or ah,0 al,'8' al,'2' ax,3030h ; ; ; ; AX AX AX AX = = = = Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. 0038h 006Ah 0100h (adjust result) 3130h = '10' Web site Examples Instrução AAS (adjust after subtraction)  Ajusta o resultado binário de uma instrução SUB ou SBB, em números ASCII .  Torna o resultado em AL consistente com BCD.  Coloca o valor Carry , se houver, em AH  Para converter o resultado em ASCII fazer  or ax, 3030h  Exemplo : Subtrair ‘8' de ‘9' mov ah,0 mov al,‘9' sub al,‘8' aas or ax,3030h ; ; ; ; AX AX AX AX = = = = 0039h 0001h 0001h, CF=0 ‘01' Web site Examples 64 Instrução AAM (ASCII adjust after multiplication)  Ajusta o resultado binário de uma instrução MUL.  A multiplicação deve usar BCD desempacotado. mov bl,05h mov al,06h mul bl aam ; ; ; ; first operand second operand AX = 001Eh AX = 0300h Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 65 Instrução AAD (ASCII adjust before division)  Converte o dividendo em BCD desempacotado, para binário, antes da operação de divisão .data quotient BYTE ? remainder BYTE ? .code mov ax,0307h aad mov bl,5 div bl mov quotient,al mov remainder,ah Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. ; ; ; ; dividend AX = 0025h divisor AX = 0207h Web site Examples 66 Próxima seção       Instruções de Shift e Rotate Aplicações de Shift e Rotate Instruções de Multiplicação e Divisão Adição e subtração estendida Aritmética ASCII e decimal desempacotado Aritmética decimal empacotado Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 67 67 Decimal ou BCD empacotado  Inteiros em decimal ou BCD empacotado armazena dois dígitos decimais por byte  Por exemplo, 12,345,678 pode ser armazenado como a seguinte seqüência de bytes em hexadecimal: 12 34 56 78 Bom para valores financeiros –é possível estender a precisão, sem arredondamento de erros. Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 68 Instrução DAA (decimal adjust after addition)  Converte o resultado binário de uma operação ADD ou ADC para o formato decimal empacotado.  O valor a ser ajustado deve estar em AL  Se o dígito menos significativo é alterado, o flag de Auxiliary Carry é acionado.  Se o dígito mais significativo é alterado, o flag de Carry é acionado. Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 69 Lógica DAA If (AL(lo) > 9) or (AuxCarry = 1) AL = AL + 6 AuxCarry = 1 Else se AL = AL + 6 aciona o AuxCarry = 0 flag de Carry, esse valor Endif de carry é usado na avaliação de AL(hi). If (AL(hi) > 9) or Carry = 1 AL = AL + 60h Carry = 1 Else Carry = 0 Endif Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 70 Exemplos de DAA  Exemplo : calcular BCD 35 + 48 mov al,35h add al,48h daa ; AL = 7Dh ; AL = 83h, AF= 1, CF = 0 • Exemplo : calcular BCD 35 + 65 mov al,35h add al,65h daa ; AL = 9Ah ; AL = 00h, AF = 1, CF = 1 • Exemplo : calcular BCD 69 + 29 mov al,69h add al,29h daa ; AL = 92h, AF = 1 ; AL = 98h, AF = 1, CF = 0 Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 71 Sua vez . . .  Um mal funcionamento temporário no computador desabilitou a instrução DAA. Escrever um procedimento em linguagem Assembly que realiza as mesmas ações do DAA.  Testar o procedimento usando os valores do slide anterior. Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 72 Instrução DAS  A instrução DAS (decimal adjust after subtraction) converte o resultado binário de uma operação SUB ou SBB para o formato decimal empacotado.  O valor deve estar em AL  Exemplo : subtrair BCD 35 de 48 mov al,48h sub al,35h das ; AL = 13h ; AL = 13h, CF = 0 Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 73 Lógica de DAS If (AL(lo) > 9) OR (AuxCarry = 1) AL = AL − 6; AuxCarry = 1; se AL = AL - 6 aciona o Else flag de Carry, esse valor AuxCarry = 0; é usado na avaliação de Endif AL no segundo IF If (AL > 9FH) or (Carry = 1) AL = AL − 60h; Carry = 1; Else Carry = 0; Endif Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 74 Exemplos de DAS (1 de 2)  Exemplo : subtrair BCD 48 – 35 mov al,48h sub al,35h das ; AL = 13h ; AL = 13h, AF=0, CF = 0 • Exemplo : subtrair BCD 62 – 35 mov al,62h sub al,35h das ; AL = 2Dh, AF = 1, CF = 0 ; AL = 27h, AF = 1, CF = 0 • Exemplo : subtrair BCD 32 – 29 mov al,32h sub al,29h das ; AL = 09h, AF = 1, CF = 0 ; AL = 03h, AF = 1, CF = 0 Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 75 Exemplos de DAS (2 de 2)  Example: subtrair BCD 32 – 39 mov al,32h sub al,39h das ; AL = F9h, AF = 1, CF = 1 ; AL = 93h, AF = 1, CF = 1 Steps: AL = F9h AF = 1, so subtract 6 from F9h AL = F3h F3h > 9Fh, so subtract 60h from F3h AL = 93h, CF = 1 Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 76 Sua vez . . .  Um mal funcionamento temporário do computador desabilitou a instrução DAS . Escrever um procedimento em linguagem Assembly que realiza as mesmas ações do DAS.  Testar o procedimento usando os valores dos dois slides anteriores. Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 77 Sumário  Instruções Shift e rotate são algumas das melhores ferramentas da linguagem assembly  Controle mais fino que em linguagens de alto nível  SHL, SHR, SAR, ROL, ROR, RCL, RCR  MUL e DIV – operações inteiras  Próximas de SHL e SHR  CBW, CDQ, CWD: preparação para divisão  Aritmética de precisão estendida: ADC, SBB  Operações decimal ASCII (AAA, AAS, AAM, AAD)  Operações decimal empacotado (DAA, DAS) Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 78 fim Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 79