61c7743c3fda880dcf9a3391cb6e561f.ppt
- Количество слайдов: 79
Assembly Language for Intel-Based Computers, 5 th Edition 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: • O shift aritmético preenche as lacunas criadas com a cópia do bit de sinal: 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. • Tipos de operando para SHL: SHL reg, imm 8 SHL mem, imm 8 SHL reg, CL SHL mem, CL Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. (mesmos para todas as instruções shift e rotate) Web site Examples 5
Fast Multiplication Deslocando 1 bit à esquerda multiplica um número por 2 mov dl, 5 shl dl, 1 Deslocando à esquerda n bits multiplica o operando por 2 n Exemplo, 5 * 22 = 20 mov dl, 5 shl dl, 2 Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. ; DL = 20 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. Deslocando n bits à direita divide o operando por 2 n 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. 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 al, 6 Bh al, 1 al, 3 al, 8 Ch al, 1 al, 3 a. 35 h b. A 8 h c. C 6 h d. F 8 h Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 9
Instrução ROL (rotate) desloca cada bit à esquerda O bit mais significativo é copiado no flag Carry e no bit menos significativo Nenhum bit é perdido mov al, 11110000 b rol al, 1 ; AL = 11100001 b mov dl, 3 Fh rol dl, 4 ; DL = F 3 h Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 10
Instrução 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 mov al, 11110000 b ror al, 1 ; AL = 01111000 b mov dl, 3 Fh ror dl, 4 ; DL = F 3 h 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, 6 Bh ror al, 1 rol al, 3 a. B 5 h b. ADh Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 12
Instrução 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 clc mov bl, 88 h rcl bl, 1 ; ; CF = 0 CF, BL = 0 1000 b CF, BL = 1 00010000 b CF, BL = 0 00100001 b Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 13
Instrução 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 stc mov ah, 10 h rcr ah, 1 ; CF = 1 ; CF, AH = 1 00010000 b ; CF, AH = 0 1000 b 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, 6 Bh rcr al, 1 rcl al, 3 Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. a. B 5 h b. AEh 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 reg 16/32, imm 8/CL SHLD mem 16/32, reg 16/32, imm 8/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 9 BA 6 h. code mov ax, 0 AC 36 h shld wval, ax, 4 Before: After: 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 reg 16/32, imm 8/CL SHRD mem 16/32, reg 16/32, imm 8/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, 234 Bh mov dx, 7654 h shrd ax, dx, 4 Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Before: After: Web site Examples 19
Sua vez. . . Indicar em valor hexadecimal cada operando destino: mov shld shrd ax, 7 C 36 h dx, 9 FA 6 h dx, ax, 4 dx, ax, 8 ; DX = FA 67 h ; DX = 36 FAh 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 Array. Size = 3 array DWORD Array. Size DUP(9999 h) ; 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 shl add eax, 123 ebx, 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 ; ; ; Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. AX * 8 AX * 2 AX * 10 recall AX * 16 AX * 26 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 L 1: shl eax, 1 mov BYTE PTR [esi], '0' jnc L 2 mov BYTE PTR [esi], '1' L 2: inc esi loop L 1 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: Isolar o campo mês: mov shr and mov ax, dx ax, 5 al, 00001111 b 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/m 8 MUL r/m 16 MUL r/m 32 Operandos implícitos: Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 30
Exemplos de MUL 100 h * 2000 h, usando operandos de 16 -bits: . data val 1 WORD 2000 h val 2 WORD 100 h. code mov ax, val 1 mul val 2 ; DX: AX = 00200000 h, CF=1 O flag Carry indica se a metade superior contem dígitos significativos 12345 h * 1000 h, usando operandos de 32 -bits: mov eax, 12345 h mov ebx, 1000 h mul ebx ; EDX: EAX = 000012345000 h, 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, 1234 h mov bx, 100 h mul bx DX = 0012 h, AX = 3400 h, 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, 00128765 h mov ecx, 10000 h mul ecx EDX = 00000012 h, EAX = 87650000 h, CF = 1 Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 33
Instrução 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 = 00 C 0 h, 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 = FFFF 86635 D 80 h, 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, 8760 h mov bx, 100 h imul bx DX = FF 87 h, AX = 6000 h, 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/m 8 DIV r/m 16 DIV r/m 32 Web site Examples 37
Exemplos de DIV Dividir 8003 h por 100 h, usando operandos de 16 -bits: mov mov div dx, 0 ax, 8003 h cx, 100 h cx ; ; clear dividend, high dividend, low divisor AX = 0080 h, DX = 3 Mesma divisão, usando operandos de 32 -bits: mov mov div edx, 0 eax, 8003 h ecx, 100 h ecx ; ; clear dividend, high dividend, low divisor EAX = 00000080 h, 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 div dx, 0087 h ax, 6000 h bx, 100 h bx DX = 0000 h, AX = 8760 h 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 div dx, 0087 h ax, 6002 h bx, 10 h 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: 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, 0 FFFFFF 9 Bh ; (-101) cdq ; EDX: EAX = FFFFFFF 9 Bh Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 42
Instrução 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, 0 FDFFh cwd mov bx, 100 h 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: var 4 = (var 1 + var 2) * var 3 ; Assume unsigned operands mov eax, var 1 add eax, var 2 ; EAX = var 1 + var 2 mul var 3 ; EAX = EAX * var 3 jc Too. Big ; check for carry mov var 4, 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 = (-var 1 * var 2) + var 3 mov neg imul jo add jo eax, var 1 eax var 2 Too. Big eax, var 3 Too. Big ; check for overflow Exemplo: var 4 = (var 1 * 5) / (var 2 – 3) mov imul mov sub idiv mov eax, var 1 ebx, 5 ebx, var 2 ebx, 3 ebx var 4, 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 : var 4 = (var 1 * -5) / (-var 2 % var 3); mov neg cdq idiv mov imul idiv mov eax, var 2 eax var 3 ebx, edx eax, -5 var 1 ebx var 4, 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 mov imul pop idiv pop edx eax, ecx edx ebx edx ; EAX needed later ; ; Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. left side: EDX: EAX saved value of EAX = quotient restore EDX 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 var 3: var 3 = (var 1 * -var 2) / (var 3 – ebx) mov neg imul mov sub idiv mov eax, var 1 edx, var 2 edx ecx, var 3 ecx, ebx ecx var 3, 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 (FFFFh + FFFFh), produzindo uma soma de 64 -bit em EDX: EAX: mov add adc edx, 0 eax, 0 FFFFFFFFh edx, 0 ; EDX: EAX = 00000001 FFFFFFFEh 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: 0000 FFFFh Somar os 32 bits menos significativos primeiro, acionando o flag Carry. Somar os 32 bits mais significativos, e incluir o flag Carry. mov add adc edx, 0 eax, 0 FFFFh eax, 1 edx, 0 ; ; set add upper lower upper half EDX: EAX = 00000001 0000 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: 000000010000 h Subtrair os 32 bits menos significativos primeiro, acionando o flag Carry. Subtrair os 32 bits mais significativos, incluindo o flag Carry. mov sub sbb edx, 1 eax, 0 eax, 1 edx, 0 ; ; set upper half set lower half subtract upper half EDX: EAX = 0000 FFFF 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, 3030 h Exemplo: somar ‘ 8’ e ‘ 2’ mov ah, 0 mov al, '8' ; AX = 0038 h add al, '2' ; AX = 006 Ah aaa ; AX = 0100 h (adjust result) or ax, 3030 h ; AX = 3130 h = '10' Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. 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, 3030 h Exemplo : Subtrair ‘ 8' de ‘ 9' mov ah, 0 mov al, ‘ 9' sub al, ‘ 8' aas or ax, 3030 h ; ; AX AX = = 0039 h 0001 h, 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, 05 h mov al, 06 h mul bl aam ; ; first operand second operand AX = 001 Eh AX = 0300 h 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, 0307 h 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 = 0025 h divisor AX = 0207 h 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 (Aux. Carry = 1) AL = AL + 6 Aux. Carry = 1 Else se AL = AL + 6 aciona o Aux. Carry = 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 + 60 h 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, 35 h add al, 48 h daa ; AL = 7 Dh ; AL = 83 h, AF= 1, CF = 0 • Exemplo : calcular BCD 35 + 65 mov al, 35 h add al, 65 h daa ; AL = 9 Ah ; AL = 00 h, AF = 1, CF = 1 • Exemplo : calcular BCD 69 + 29 mov al, 69 h add al, 29 h daa ; AL = 92 h, AF = 1 ; AL = 98 h, 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, 48 h sub al, 35 h das ; AL = 13 h, Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. CF = 0 Web site Examples 73
Lógica de DAS If (AL(lo) > 9) OR (Aux. Carry = 1) AL = AL − 6; Aux. Carry = 1; se AL = AL - 6 aciona o Else flag de Carry, esse valor Aux. Carry = 0; é usado na avaliação de Endif AL no segundo IF If (AL > 9 FH) or (Carry = 1) AL = AL − 60 h; 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, 48 h sub al, 35 h das ; AL = 13 h, AF=0, CF = 0 • Exemplo : subtrair BCD 62 – 35 mov al, 62 h sub al, 35 h das ; AL = 2 Dh, AF = 1, CF = 0 ; AL = 27 h, AF = 1, CF = 0 • Exemplo : subtrair BCD 32 – 29 mov al, 32 h sub al, 29 h das ; AL = 09 h, AF = 1, CF = 0 ; AL = 03 h, 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, 32 h sub al, 39 h das ; AL = F 9 h, AF = 1, CF = 1 ; AL = 93 h, AF = 1, CF = 1 Steps: AL = F 9 h AF = 1, so subtract 6 from F 9 h AL = F 3 h > 9 Fh, so subtract 60 h from F 3 h AL = 93 h, 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 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
61c7743c3fda880dcf9a3391cb6e561f.ppt