A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Web siteWeb site ExamplesExamples Capítulo 7: Aritmética de Inteiros (c) Pearson Education, 2006-2007. All rights reserved. You may modify and copy this.

Apresentações semelhantes


Apresentação em tema: "Web siteWeb site ExamplesExamples Capítulo 7: Aritmética de Inteiros (c) Pearson Education, 2006-2007. All rights reserved. You may modify and copy this."— Transcrição da apresentação:

1 Web siteWeb site ExamplesExamples Capítulo 7: Aritmética de Inteiros (c) Pearson Education, 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. Slides prepared by the author Revision date: June 4, 2006 Kip R. Irvine

2 Web siteWeb site ExamplesExamples Í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,

3 Web siteWeb site ExamplesExamples 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,

4 Web siteWeb site ExamplesExamples Shift lógico vs. aritmético O shift lógico preenche as lacunas criadas com zero: Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, O shift aritmético preenche as lacunas criadas com a cópia do bit de sinal:

5 Web siteWeb site ExamplesExamples Instrução SHL A instrução SHL (shift left) faz o deslocamento lógico à esquerda do operando destino, preenchendo o bit à direita com 0. Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 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)

6 Web siteWeb site ExamplesExamples Fast Multiplication Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, mov dl,5 shl dl,1 Deslocando 1 bit à esquerda multiplica um número por 2 mov dl,5 shl dl,2; DL = 20 Deslocando à esquerda n bits multiplica o operando por 2 n Exemplo, 5 * 2 2 = 20

7 Web siteWeb site ExamplesExamples 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. Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, mov dl,80 shr dl,1; DL = 40 shr dl,2; DL = 10 Deslocando n bits à direita divide o operando por 2 n

8 Web siteWeb site ExamplesExamples 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. Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, Um shift aritmético preserva o sinal do número. mov dl,-80 sar dl,1; DL = -40 sar dl,2; DL = -10

9 Web siteWeb site ExamplesExamples Sua vez... Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, mov al,6Bh shr al,1a. shl al,3b. mov al,8Ch sar al,1c. sar al,3d. Indicar o valor em hexadecimal de AL após cada shift: 35h A8h C6h F8h

10 Web siteWeb site ExamplesExamples 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 Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, mov al, b rol al,1; AL = b mov dl,3Fh rol dl,4; DL = F3h

11 Web siteWeb site ExamplesExamples 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 Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, mov al, b ror al,1; AL = b mov dl,3Fh ror dl,4; DL = F3h

12 Web siteWeb site ExamplesExamples Sua vez... Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, mov al,6Bh ror al,1a. rol al,3b. Indicar o valor hexadecimal de AL após cada rotação: B5h ADh

13 Web siteWeb site ExamplesExamples 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 Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, clc; CF = 0 mov bl,88h; CF,BL = b rcl bl,1; CF,BL = b rcl bl,1; CF,BL = b

14 Web siteWeb site ExamplesExamples 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 Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, stc; CF = 1 mov ah,10h; CF,AH = b rcr ah,1; CF,AH = b

15 Web siteWeb site ExamplesExamples Sua vez... Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, stc mov al,6Bh rcr al,1a. rcl al,3b. Indicar o valor hexadecimal de AL após cada rotação: B5h AEh

16 Web siteWeb site ExamplesExamples 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: Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, SHLD reg16/32, reg16/32, imm8/CL SHLD mem16/32, reg16/32, imm8/CL

17 Web siteWeb site ExamplesExamples Exemplo de SHLD Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, data wval WORD 9BA6h.code mov ax,0AC36h shld wval,ax,4 Desloca wval 4 bits à esquerda e substitui os 4 bits menos significativos com os 4 bits mais significativos de AX: Before: After:

18 Web siteWeb site ExamplesExamples 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: Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, SHRD reg16/32, reg16/32, imm8/CL SHRD mem16/32, reg16/32, imm8/CL

19 Web siteWeb site ExamplesExamples Exemplo de SHRD Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, mov ax,234Bh mov dx,7654h shrd ax,dx,4 Desloca AX 4 bits à direita e substitui os 4 bits mais significativos com os 4 bits menos significativos de DX: Before: After:

20 Web siteWeb site ExamplesExamples Sua vez... Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, mov ax,7C36h mov dx,9FA6h shld dx,ax,4; DX = shrd dx,ax,8; DX = Indicar em valor hexadecimal cada operando destino: FA67h 36FAh

21 Web siteWeb site ExamplesExamples 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,

22 Web siteWeb site ExamplesExamples 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,

23 Web siteWeb site ExamplesExamples 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: Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, data ArraySize = 3 array DWORD ArraySize DUP( h) ; 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

24 Web siteWeb site ExamplesExamples 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 e usar a propriedade distributiva de multiplicação : Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, EAX * 36 = EAX * (32 + 4) = (EAX * 32)+(EAX * 4) mov eax,123 mov ebx,eax shl eax,5; mult by 2 5 shl ebx,2; mult by 2 2 add eax,ebx

25 Web siteWeb site ExamplesExamples Sua vez... Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, mov ax,2; test value mov dx,ax shl dx,4; AX * 16 push dx; save for later mov dx,ax shl dx,3; AX * 8 shl ax,1; AX * 2 add ax,dx; AX * 10 pop dx; recall AX * 16 add ax,dx; AX * 26 Multiplicar AX por 26, usando deslocamento e adição. Dica: 26 =

26 Web siteWeb site ExamplesExamples 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. Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 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

27 Web siteWeb site ExamplesExamples Isolando uma cadeia de bits O campo de data do arquivo MS-DOS empacota o ano, mês e dia em 16 bits: Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, mov ax,dx; make a copy of DX shr ax,5; shift right 5 bits and al, b; clear bits 4-7 mov month,al; save in month variable Isolar o campo mês:

28 Web siteWeb site ExamplesExamples Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 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 28

29 Web siteWeb site ExamplesExamples 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,

30 Web siteWeb site ExamplesExamples 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 Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, Operandos implícitos:

31 Web siteWeb site ExamplesExamples Exemplos de MUL Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, h * 2000h, usando operandos de 16-bits:.data val1 WORD 2000h val2 WORD 100h.code mov ax,val1 mul val2; DX:AX = h, CF=1 O flag Carry indica se a metade superior contem dígitos significativos mov eax,12345h mov ebx,1000h mul ebx; EDX:EAX = h, CF= h * 1000h, usando operandos de 32-bits:

32 Web siteWeb site ExamplesExamples Sua vez... Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, mov ax,1234h mov bx,100h mul bx Quais seriam os valores em hexadecimal de DX, AX, e flag Carry após a execução das instruções seguintes? DX = 0012h, AX = 3400h, CF = 1

33 Web siteWeb site ExamplesExamples Sua vez... Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, mov eax, h mov ecx,10000h mul ecx Quais serão os valores em hexadecimal de EDX, EAX, e flag Carry após a execução das seguintes instruções? EDX = h, EAX = h, CF = 1

34 Web siteWeb site ExamplesExamples 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 Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 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.

35 Web siteWeb site ExamplesExamples Exemplos de IMUL Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, Multiplicar 4,823,424 * 423: mov eax, mov ebx,-423 imul ebx; EDX:EAX = FFFFFFFF86635D80h, OF=0 OF=0 porque EDX é somente extensão de sinal de EAX.

36 Web siteWeb site ExamplesExamples Sua vez... Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, mov ax,8760h mov bx,100h imul bx Quais serão os valores hexadecimal de DX, AX, flag Carry e overflow flag após a execução das seguintes instruções? DX = FF87h, AX = 6000h, CF=1, OF = 1

37 Web siteWeb site ExamplesExamples 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) Formatos: DIV r/m8 DIV r/m16 DIV r/m32 37 Operandos Default:

38 Web siteWeb site ExamplesExamples Exemplos de DIV Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, Dividir 8003h por 100h, usando operandos de 16-bits: mov dx,0; clear dividend, high mov ax,8003h; dividend, low mov cx,100h; divisor div cx; AX = 0080h, DX = 3 Mesma divisão, usando operandos de 32-bits: mov edx,0; clear dividend, high mov eax,8003h; dividend, low mov ecx,100h; divisor div ecx; EAX = h, EDX = 3

39 Web siteWeb site ExamplesExamples Sua vez... Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, mov dx,0087h mov ax,6000h mov bx,100h div bx Quais os valores em hexadecimal de DX e AX após a execução das seguintes instruções? Ou, indicar se ocorre divide overflow: DX = 0000h, AX = 8760h

40 Web siteWeb site ExamplesExamples Sua vez... Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, mov dx,0087h mov ax,6002h mov bx,10h div bx Quais os valores em hexadecimal de DX e AX após a execução das seguintes instruções? Ou, indicar se ocorrer divide overflow: Divide Overflow

41 Web siteWeb site ExamplesExamples 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: Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e,

42 Web siteWeb site ExamplesExamples 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,

43 Web siteWeb site ExamplesExamples Instrução IDIV IDIV faz a divisão de inteiro com sinal Mesma sintaxe e operandos como na instrução DIV Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, Exemplo: divisão de 8-bits de –48 por 5 mov al,-48 cbw; extend AL into AH mov bl,5 idiv bl; AL = -9, AH = -3

44 Web siteWeb site ExamplesExamples Exemplos de IDIV Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, Exemplo: divisão de 32-bits de –48 por 5 mov eax,-48 cdq; extend EAX into EDX mov ebx,5 idiv ebx; EAX = -9, EDX = -3 Exemplo: divisão de 16-bits de –48 por 5 mov ax,-48 cwd; extend AX into DX mov bx,5 idiv bx; AX = -9, DX = -3

45 Web siteWeb site ExamplesExamples Sua vez.... Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, mov ax,0FDFFh; -513 cwd mov bx,100h idiv bx 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: DX = FFFFh ( 1), AX = FFFEh ( 2)

46 Web siteWeb site ExamplesExamples 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 ) Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 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

47 Web siteWeb site ExamplesExamples Expressões aritmética com sinal (1 de 2) Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, Exemplo: eax = (-var1 * var2) + var3 mov eax,var1 neg eax imul var2 jo TooBig; check for overflow add eax,var3 jo TooBig; check for overflow Exemplo: var4 = (var1 * 5) / (var2 – 3) mov eax,var1 ; left side mov ebx,5 imul ebx ; EDX:EAX = product mov ebx,var2 ; right side sub ebx,3 idiv ebx ; EAX = quotient mov var4,eax

48 Web siteWeb site ExamplesExamples Expressões aritmética com sinal (2 de 2) Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, Exemplo : var4 = (var1 * -5) / (-var2 % var3); mov eax,var2; begin right side neg eax cdq ; sign-extend dividend idiv var3 ; EDX = remainder mov ebx,edx ; EBX = right side mov eax,-5 ; begin left side imul var1 ; EDX:EAX = left side idiv ebx ; final division mov var4,eax ; quotient As vezes é mais fácil calcular o termo à direita primeiro.

49 Web siteWeb site ExamplesExamples Sua vez... Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, mov eax,20 imul ebx idiv ecx Implementar a seguinte expressão usando inteiros de 32 bits com sinal: eax = (ebx * 20) / ecx

50 Web siteWeb site ExamplesExamples Sua vez... Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, push edx push eax; EAX needed later mov eax,ecx imul edx; left side: EDX:EAX pop ebx; saved value of EAX idiv ebx; EAX = quotient pop edx; restore EDX Implementar a seguinte expressão usando inteiros de 32 bits com sinal. Salvar e restaurar EDX: eax = (ecx * edx) / eax

51 Web siteWeb site ExamplesExamples Sua vez... Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, mov eax,var1 mov edx,var2 neg edx imul edx; left side: EDX:EAX mov ecx,var3 sub ecx,ebx idiv ecx; EAX = quotient mov var3,eax 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)

52 Web siteWeb site ExamplesExamples 52 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,

53 Web siteWeb site ExamplesExamples 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,

54 Web siteWeb site ExamplesExamples 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,

55 Web siteWeb site ExamplesExamples 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 edx,0 mov eax,0FFFFFFFFh add eax,0FFFFFFFFh adc edx,0;EDX:EAX = FFFFFFFEh Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e,

56 Web siteWeb site ExamplesExamples Exemplo de adição com precisão estendida Tarefa: somar 1 a EDX:EAX Valor inicial de EDX:EAX: FFFFFFFFh Somar os 32 bits menos significativos primeiro, acionando o flag Carry. Somar os 32 bits mais significativos, e incluir o flag Carry. Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, mov edx,0; set upper half mov eax,0FFFFFFFFh; set lower half add eax,1 ; add lower half adc edx,0 ; add upper half EDX:EAX =

57 Web siteWeb site ExamplesExamples 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,

58 Web siteWeb site ExamplesExamples Exemplo de subtração estendida Tarefa: Subtrair 1 de EDX:EAX Valor inicial de EDX:EAX: h Subtrair os 32 bits menos significativos primeiro, acionando o flag Carry. Subtrair os 32 bits mais significativos, incluindo o flag Carry. Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, mov edx,1 ; set upper half mov eax,0 ; set lower half sub eax,1 ; subtract lower half sbb edx,0 ; subtract upper half EDX:EAX = FFFFFFFF

59 Web siteWeb site ExamplesExamples 59 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,

60 Web siteWeb site ExamplesExamples 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,

61 Web siteWeb site ExamplesExamples 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: Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e,

62 Web siteWeb site ExamplesExamples 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: Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e,

63 Web siteWeb site ExamplesExamples 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 Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, mov ah,0 mov al,'8'; AX = 0038h add al,'2'; AX = 006Ah aaa; AX = 0100h (adjust result) or ax,3030h; AX = 3130h = '10'

64 Web siteWeb site ExamplesExamples 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' 64 mov ah,0 mov al,9'; AX = 0039h sub al,8'; AX = 0001h aas; AX = 0001h, CF=0 or ax,3030h; AX = 01'

65 Web siteWeb site ExamplesExamples Instrução AAM (ASCII adjust after multiplication) Ajusta o resultado binário de uma instrução MUL. A multiplicação deve usar BCD desempacotado. Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, mov bl,05h; first operand mov al,06h; second operand mul bl ; AX = 001Eh aam; AX = 0300h

66 Web siteWeb site ExamplesExamples Instrução AAD (ASCII adjust before division) Converte o dividendo em BCD desempacotado, para binário, antes da operação de divisão Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, data quotient BYTE ? remainder BYTE ?.code mov ax,0307h ; dividend aad ; AX = 0025h mov bl,5 ; divisor div bl ; AX = 0207h mov quotient,al mov remainder,ah

67 Web siteWeb site ExamplesExamples Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 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 67

68 Web siteWeb site ExamplesExamples 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: Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, Bom para valores financeiros –é possível estender a precisão, sem arredondamento de erros.

69 Web siteWeb site ExamplesExamples 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,

70 Web siteWeb site ExamplesExamples Lógica DAA If (AL(lo) > 9) or (AuxCarry = 1) AL = AL + 6 AuxCarry = 1 Else AuxCarry = 0 Endif 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, se AL = AL + 6 aciona o flag de Carry, esse valor de carry é usado na avaliação de AL(hi).

71 Web siteWeb site ExamplesExamples Exemplos de DAA Exemplo : calcular BCD Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, mov al,35h add al,48h ; AL = 7Dh daa ; AL = 83h, AF= 1, CF = 0 Exemplo : calcular BCD mov al,35h add al,65h ; AL = 9Ah daa ; AL = 00h, AF = 1, CF = 1 Exemplo : calcular BCD mov al,69h add al,29h ; AL = 92h, AF = 1 daa ; AL = 98h, AF = 1, CF = 0

72 Web siteWeb site ExamplesExamples 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,

73 Web siteWeb site ExamplesExamples 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 Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, mov al,48h sub al,35h ; AL = 13h das ; AL = 13h, CF = 0

74 Web siteWeb site ExamplesExamples Lógica de DAS Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, If (AL(lo) > 9) OR (AuxCarry = 1) AL = AL 6; AuxCarry = 1; Else AuxCarry = 0; Endif If (AL > 9FH) or (Carry = 1) AL = AL 60h; Carry = 1; Else Carry = 0; Endif se AL = AL 6 aciona o flag de Carry, esse valor é usado na avaliação de AL no segundo IF

75 Web siteWeb site ExamplesExamples Exemplos de DAS (1 de 2) Exemplo : subtrair BCD 48 – 35 Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, mov al,48h sub al,35h ; AL = 13h das ; AL = 13h, AF=0, CF = 0 Exemplo : subtrair BCD 62 – 35 mov al,62h sub al,35h ; AL = 2Dh, AF = 1, CF = 0 das ; AL = 27h, AF = 1, CF = 0 Exemplo : subtrair BCD 32 – 29 mov al,32h sub al,29h ; AL = 09h, AF = 1, CF = 0 das ; AL = 03h, AF = 1, CF = 0

76 Web siteWeb site ExamplesExamples Exemplos de DAS (2 de 2) Example: subtrair BCD 32 – 39 Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, mov al,32h sub al,39h ; AL = F9h, AF = 1, CF = 1 das ; 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

77 Web siteWeb site ExamplesExamples 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,

78 Web siteWeb site ExamplesExamples 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,

79 Web siteWeb site ExamplesExamples fim Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e,


Carregar ppt "Web siteWeb site ExamplesExamples Capítulo 7: Aritmética de Inteiros (c) Pearson Education, 2006-2007. All rights reserved. You may modify and copy this."

Apresentações semelhantes


Anúncios Google