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