Introdução ao Assembly - PUC-Rioinf1018/corrente/aulas/Assembly-Introducao.pdf · Introdução ao...
Transcript of Introdução ao Assembly - PUC-Rioinf1018/corrente/aulas/Assembly-Introducao.pdf · Introdução ao...
![Page 1: Introdução ao Assembly - PUC-Rioinf1018/corrente/aulas/Assembly-Introducao.pdf · Introdução ao Assembly Movimentação de Dados Operações Aritméticas e Lógicas Noemi Rodriguez](https://reader036.fdocuments.net/reader036/viewer/2022062608/6085677590b01f2e3654922b/html5/thumbnails/1.jpg)
Introdução ao Assembly
Movimentação de DadosOperações Aritméticas e Lógicas
Noemi Rodriguez
Ana Lúcia de MouraRaúl RenteriaAlexandre Meslin
http://www.inf.puc-rio.br/~inf1018
![Page 2: Introdução ao Assembly - PUC-Rioinf1018/corrente/aulas/Assembly-Introducao.pdf · Introdução ao Assembly Movimentação de Dados Operações Aritméticas e Lógicas Noemi Rodriguez](https://reader036.fdocuments.net/reader036/viewer/2022062608/6085677590b01f2e3654922b/html5/thumbnails/2.jpg)
Representação de Programas
O compilador gera o código de um programa conforme o conjunto de instruções da máquina alvo as regras estabelecidas pela linguagem de programação (C) as convenções seguidas pelo sistema operacional
![Page 3: Introdução ao Assembly - PUC-Rioinf1018/corrente/aulas/Assembly-Introducao.pdf · Introdução ao Assembly Movimentação de Dados Operações Aritméticas e Lógicas Noemi Rodriguez](https://reader036.fdocuments.net/reader036/viewer/2022062608/6085677590b01f2e3654922b/html5/thumbnails/3.jpg)
Visão do Programador Assembly
FLAGS
CPU
registradores
RIP
ALU
Memória
código dados
pilha (stack)
endereços
dados
instruções
RIP: endereço da próxima instrução
Registradores: valores inteiros, endereços
FLAGS: status da última operação overflow? zero? resultado < 0?
![Page 4: Introdução ao Assembly - PUC-Rioinf1018/corrente/aulas/Assembly-Introducao.pdf · Introdução ao Assembly Movimentação de Dados Operações Aritméticas e Lógicas Noemi Rodriguez](https://reader036.fdocuments.net/reader036/viewer/2022062608/6085677590b01f2e3654922b/html5/thumbnails/4.jpg)
Linguagem de Montagem
Instruções executam operações simples
operações aritméticas/lógicas
transferência de dados
controle do fluxo de execução (desvios, chamadas de função)
![Page 5: Introdução ao Assembly - PUC-Rioinf1018/corrente/aulas/Assembly-Introducao.pdf · Introdução ao Assembly Movimentação de Dados Operações Aritméticas e Lógicas Noemi Rodriguez](https://reader036.fdocuments.net/reader036/viewer/2022062608/6085677590b01f2e3654922b/html5/thumbnails/5.jpg)
Linguagem de Montagem
Instruções executam operações simples
operações aritméticas/lógicas
transferência de dados
controle do fluxo de execução (desvios, chamadas de função)
Tipos de dados básicos
valores inteiros (1,2,4,8 bytes)
endereços de memória
valores em ponto flutuante
![Page 6: Introdução ao Assembly - PUC-Rioinf1018/corrente/aulas/Assembly-Introducao.pdf · Introdução ao Assembly Movimentação de Dados Operações Aritméticas e Lógicas Noemi Rodriguez](https://reader036.fdocuments.net/reader036/viewer/2022062608/6085677590b01f2e3654922b/html5/thumbnails/6.jpg)
Programa em assembly
.data
nums: .int 10, -21, -30, 45…
.text
.globl main
main: …
movl $0, %ebx /* i */
movq $nums, %r12 /* p */
L1:
cmpl $4, %ebx /* if (i == 4) */
je L2 /* goto L2 */
movl (%r12), %eax /* eax = *p */ …
addl $1, %ebx /* i++ */
addq $4, %r12 /* p++ */
jmp L1
L2: …
ret
dadosglobais
código
labels
int nums[] = {10, -21, -30, 45};int main() { int i, *p; for (i = 0, p = nums; i != 4; i++, p++) printf("%d\n", *p); return 0;}
![Page 7: Introdução ao Assembly - PUC-Rioinf1018/corrente/aulas/Assembly-Introducao.pdf · Introdução ao Assembly Movimentação de Dados Operações Aritméticas e Lógicas Noemi Rodriguez](https://reader036.fdocuments.net/reader036/viewer/2022062608/6085677590b01f2e3654922b/html5/thumbnails/7.jpg)
Registradores
Armazenam valores inteiros e endereços (ponteiros)
podem ser usados como valores de 64, 32, 16 e 8 bits
%rbp e %rsp são usados como ponteiros para a pilha
![Page 8: Introdução ao Assembly - PUC-Rioinf1018/corrente/aulas/Assembly-Introducao.pdf · Introdução ao Assembly Movimentação de Dados Operações Aritméticas e Lógicas Noemi Rodriguez](https://reader036.fdocuments.net/reader036/viewer/2022062608/6085677590b01f2e3654922b/html5/thumbnails/8.jpg)
Movimentação de Dados
mov fonte, destino
Constante
Memória
Reg
Mem
Reg
Mem
Reg
Registrador
Memória Mem
![Page 9: Introdução ao Assembly - PUC-Rioinf1018/corrente/aulas/Assembly-Introducao.pdf · Introdução ao Assembly Movimentação de Dados Operações Aritméticas e Lógicas Noemi Rodriguez](https://reader036.fdocuments.net/reader036/viewer/2022062608/6085677590b01f2e3654922b/html5/thumbnails/9.jpg)
Movimentação de Dados
mov[b w l q] fonte, destino
Constante
Memória
Reg
Mem
Reg
Mem
Reg
Registrador
Memória Mem
movl $0x4050,%eax
movq $nums,%r12
movl %ebx,%ecx
movq %r12,%r13
movl %edx,(%rbx)
movl (%r12),%eax
movb (%r12),%al
o sufixo especifica o tamanho dos operandos
![Page 10: Introdução ao Assembly - PUC-Rioinf1018/corrente/aulas/Assembly-Introducao.pdf · Introdução ao Assembly Movimentação de Dados Operações Aritméticas e Lógicas Noemi Rodriguez](https://reader036.fdocuments.net/reader036/viewer/2022062608/6085677590b01f2e3654922b/html5/thumbnails/10.jpg)
Constantes e Registradores
Constantes (imediatos) são escritas com um $ seguido por valor inteiro em notação C
Registradores são especificados pelo nome
![Page 11: Introdução ao Assembly - PUC-Rioinf1018/corrente/aulas/Assembly-Introducao.pdf · Introdução ao Assembly Movimentação de Dados Operações Aritméticas e Lógicas Noemi Rodriguez](https://reader036.fdocuments.net/reader036/viewer/2022062608/6085677590b01f2e3654922b/html5/thumbnails/11.jpg)
Constantes e Registradores
Constantes (imediatos) são escritas com um $ seguido por valor inteiro em notação C
Registradores são especificados pelo nome
movl $1024, %eax
movabsq $1, %rax /* para constantes de 64 bits */
movl $0xFF, %ebx
movb $0, %al
movl %ebx, %ecx
movq %r12, %r13
![Page 12: Introdução ao Assembly - PUC-Rioinf1018/corrente/aulas/Assembly-Introducao.pdf · Introdução ao Assembly Movimentação de Dados Operações Aritméticas e Lógicas Noemi Rodriguez](https://reader036.fdocuments.net/reader036/viewer/2022062608/6085677590b01f2e3654922b/html5/thumbnails/12.jpg)
Valores em Memória: modo indireto
O endereço de memória está em um registrador
o nome do registrador é escrito entre parênteses
![Page 13: Introdução ao Assembly - PUC-Rioinf1018/corrente/aulas/Assembly-Introducao.pdf · Introdução ao Assembly Movimentação de Dados Operações Aritméticas e Lógicas Noemi Rodriguez](https://reader036.fdocuments.net/reader036/viewer/2022062608/6085677590b01f2e3654922b/html5/thumbnails/13.jpg)
Valores em Memória: modo indireto
O endereço de memória está em um registrador
o nome do registrador é escrito entre parênteses
%rbx 0x7fff526a897c
![Page 14: Introdução ao Assembly - PUC-Rioinf1018/corrente/aulas/Assembly-Introducao.pdf · Introdução ao Assembly Movimentação de Dados Operações Aritméticas e Lógicas Noemi Rodriguez](https://reader036.fdocuments.net/reader036/viewer/2022062608/6085677590b01f2e3654922b/html5/thumbnails/14.jpg)
Valores em Memória: modo indireto
O endereço de memória está em um registrador
o nome do registrador é escrito entre parênteses
%rbx 0x7fff526a897c
movl $1, (%rbx)
![Page 15: Introdução ao Assembly - PUC-Rioinf1018/corrente/aulas/Assembly-Introducao.pdf · Introdução ao Assembly Movimentação de Dados Operações Aritméticas e Lógicas Noemi Rodriguez](https://reader036.fdocuments.net/reader036/viewer/2022062608/6085677590b01f2e3654922b/html5/thumbnails/15.jpg)
Valores em Memória: modo indireto
O endereço de memória está em um registrador
o nome do registrador é escrito entre parênteses
%rbx 0x7fff526a897c
memória0x7fff526a897cmovl $1, (%rbx) 1
![Page 16: Introdução ao Assembly - PUC-Rioinf1018/corrente/aulas/Assembly-Introducao.pdf · Introdução ao Assembly Movimentação de Dados Operações Aritméticas e Lógicas Noemi Rodriguez](https://reader036.fdocuments.net/reader036/viewer/2022062608/6085677590b01f2e3654922b/html5/thumbnails/16.jpg)
Valores em Memória: modo indireto
O endereço de memória está em um registrador
o nome do registrador é escrito entre parênteses
%rbx 0x7fff526a897c
memória0x7fff526a897cmovl $1, (%rbx) 1
movl (%rbx), %eax
![Page 17: Introdução ao Assembly - PUC-Rioinf1018/corrente/aulas/Assembly-Introducao.pdf · Introdução ao Assembly Movimentação de Dados Operações Aritméticas e Lógicas Noemi Rodriguez](https://reader036.fdocuments.net/reader036/viewer/2022062608/6085677590b01f2e3654922b/html5/thumbnails/17.jpg)
Valores em Memória: modo indireto
O endereço de memória está em um registrador
o nome do registrador é escrito entre parênteses
%rbx 0x7fff526a897c
memória0x7fff526a897c
%eax
movl $1, (%rbx) 1
movl (%rbx), %eax 1
![Page 18: Introdução ao Assembly - PUC-Rioinf1018/corrente/aulas/Assembly-Introducao.pdf · Introdução ao Assembly Movimentação de Dados Operações Aritméticas e Lógicas Noemi Rodriguez](https://reader036.fdocuments.net/reader036/viewer/2022062608/6085677590b01f2e3654922b/html5/thumbnails/18.jpg)
Valores em Memória: base-deslocamento
Um registrador tem um endereço de memória
ao endereço é somado um deslocamento
![Page 19: Introdução ao Assembly - PUC-Rioinf1018/corrente/aulas/Assembly-Introducao.pdf · Introdução ao Assembly Movimentação de Dados Operações Aritméticas e Lógicas Noemi Rodriguez](https://reader036.fdocuments.net/reader036/viewer/2022062608/6085677590b01f2e3654922b/html5/thumbnails/19.jpg)
Valores em Memória: base-deslocamento
Um registrador tem um endereço de memória
ao endereço é somado um deslocamento
%rbx 0x7fff526a8970
![Page 20: Introdução ao Assembly - PUC-Rioinf1018/corrente/aulas/Assembly-Introducao.pdf · Introdução ao Assembly Movimentação de Dados Operações Aritméticas e Lógicas Noemi Rodriguez](https://reader036.fdocuments.net/reader036/viewer/2022062608/6085677590b01f2e3654922b/html5/thumbnails/20.jpg)
Valores em Memória: base-deslocamento
Um registrador tem um endereço de memória
ao endereço é somado um deslocamento
%rbx 0x7fff526a8970
movl $1, 4(%rbx)
![Page 21: Introdução ao Assembly - PUC-Rioinf1018/corrente/aulas/Assembly-Introducao.pdf · Introdução ao Assembly Movimentação de Dados Operações Aritméticas e Lógicas Noemi Rodriguez](https://reader036.fdocuments.net/reader036/viewer/2022062608/6085677590b01f2e3654922b/html5/thumbnails/21.jpg)
Valores em Memória: base-deslocamento
Um registrador tem um endereço de memória
ao endereço é somado um deslocamento
%rbx 0x7fff526a8970
memória0x7fff526a8974movl $1, 4(%rbx) 1
![Page 22: Introdução ao Assembly - PUC-Rioinf1018/corrente/aulas/Assembly-Introducao.pdf · Introdução ao Assembly Movimentação de Dados Operações Aritméticas e Lógicas Noemi Rodriguez](https://reader036.fdocuments.net/reader036/viewer/2022062608/6085677590b01f2e3654922b/html5/thumbnails/22.jpg)
Valores em Memória: base-deslocamento
Um registrador tem um endereço de memória
ao endereço é somado um deslocamento
%rbx 0x7fff526a8970
memória0x7fff526a8974movl $1, 4(%rbx) 1
movl 4(%rbx), %eax
![Page 23: Introdução ao Assembly - PUC-Rioinf1018/corrente/aulas/Assembly-Introducao.pdf · Introdução ao Assembly Movimentação de Dados Operações Aritméticas e Lógicas Noemi Rodriguez](https://reader036.fdocuments.net/reader036/viewer/2022062608/6085677590b01f2e3654922b/html5/thumbnails/23.jpg)
Valores em Memória: base-deslocamento
Um registrador tem um endereço de memória
ao endereço é somado um deslocamento
%rbx 0x7fff526a8970
memória0x7fff526a8974movl $1, 4(%rbx) 1
movl 4(%rbx), %eax %eax 1
![Page 24: Introdução ao Assembly - PUC-Rioinf1018/corrente/aulas/Assembly-Introducao.pdf · Introdução ao Assembly Movimentação de Dados Operações Aritméticas e Lógicas Noemi Rodriguez](https://reader036.fdocuments.net/reader036/viewer/2022062608/6085677590b01f2e3654922b/html5/thumbnails/24.jpg)
Valores em Memória: modo absoluto
O endereço de memória é especificado por uma constante ou rótulo (label)
não existe o conceito de variável!
![Page 25: Introdução ao Assembly - PUC-Rioinf1018/corrente/aulas/Assembly-Introducao.pdf · Introdução ao Assembly Movimentação de Dados Operações Aritméticas e Lógicas Noemi Rodriguez](https://reader036.fdocuments.net/reader036/viewer/2022062608/6085677590b01f2e3654922b/html5/thumbnails/25.jpg)
Valores em Memória: modo absoluto
O endereço de memória é especificado por uma constante ou rótulo (label)
não existe o conceito de variável!
memória0x7fff526a897c 10
.data x: .int 10
![Page 26: Introdução ao Assembly - PUC-Rioinf1018/corrente/aulas/Assembly-Introducao.pdf · Introdução ao Assembly Movimentação de Dados Operações Aritméticas e Lógicas Noemi Rodriguez](https://reader036.fdocuments.net/reader036/viewer/2022062608/6085677590b01f2e3654922b/html5/thumbnails/26.jpg)
Valores em Memória: modo absoluto
O endereço de memória é especificado por uma constante ou rótulo (label)
não existe o conceito de variável!
memória0x7fff526a897c 10
.data x: .int 10
movl x, %eax
![Page 27: Introdução ao Assembly - PUC-Rioinf1018/corrente/aulas/Assembly-Introducao.pdf · Introdução ao Assembly Movimentação de Dados Operações Aritméticas e Lógicas Noemi Rodriguez](https://reader036.fdocuments.net/reader036/viewer/2022062608/6085677590b01f2e3654922b/html5/thumbnails/27.jpg)
Valores em Memória: modo absoluto
O endereço de memória é especificado por uma constante ou rótulo (label)
não existe o conceito de variável!
memória0x7fff526a897c 10
.data x: .int 10
movl x, %eax 10%eax
![Page 28: Introdução ao Assembly - PUC-Rioinf1018/corrente/aulas/Assembly-Introducao.pdf · Introdução ao Assembly Movimentação de Dados Operações Aritméticas e Lógicas Noemi Rodriguez](https://reader036.fdocuments.net/reader036/viewer/2022062608/6085677590b01f2e3654922b/html5/thumbnails/28.jpg)
Valores em Memória: modo absoluto
O endereço de memória é especificado por uma constante ou rótulo (label)
não existe o conceito de variável!
memória0x7fff526a897c 10
.data x: .int 10
movl x, %eax 10%eax
$x é uma constante (é o endereço associado a x)
![Page 29: Introdução ao Assembly - PUC-Rioinf1018/corrente/aulas/Assembly-Introducao.pdf · Introdução ao Assembly Movimentação de Dados Operações Aritméticas e Lógicas Noemi Rodriguez](https://reader036.fdocuments.net/reader036/viewer/2022062608/6085677590b01f2e3654922b/html5/thumbnails/29.jpg)
Valores em Memória: modo absoluto
O endereço de memória é especificado por uma constante ou rótulo (label)
não existe o conceito de variável!
memória0x7fff526a897c 10
.data x: .int 10
movl x, %eax 10%eax
$x é uma constante (endereço associado a x)
movq $x, %rbx
![Page 30: Introdução ao Assembly - PUC-Rioinf1018/corrente/aulas/Assembly-Introducao.pdf · Introdução ao Assembly Movimentação de Dados Operações Aritméticas e Lógicas Noemi Rodriguez](https://reader036.fdocuments.net/reader036/viewer/2022062608/6085677590b01f2e3654922b/html5/thumbnails/30.jpg)
Valores em Memória: modo absoluto
O endereço de memória é especificado por uma constante ou rótulo (label)
não existe o conceito de variável!
memória0x7fff526a897c 10
.data x: .int 10
movl x, %eax 10%eax
$x é uma constante (endereço associado a x)
movq $x, %rbx 0x7fff526a897c%rbx
![Page 31: Introdução ao Assembly - PUC-Rioinf1018/corrente/aulas/Assembly-Introducao.pdf · Introdução ao Assembly Movimentação de Dados Operações Aritméticas e Lógicas Noemi Rodriguez](https://reader036.fdocuments.net/reader036/viewer/2022062608/6085677590b01f2e3654922b/html5/thumbnails/31.jpg)
Valores em memória: movimentação
Movimento de dados sempre
CPU ↔ memória
Nunca dois operandos em memória !!!
![Page 32: Introdução ao Assembly - PUC-Rioinf1018/corrente/aulas/Assembly-Introducao.pdf · Introdução ao Assembly Movimentação de Dados Operações Aritméticas e Lógicas Noemi Rodriguez](https://reader036.fdocuments.net/reader036/viewer/2022062608/6085677590b01f2e3654922b/html5/thumbnails/32.jpg)
Valores em memória: movimentação
Movimento de dados sempre
CPU ↔ memória
Nunca dois operandos em memória !!!
movl (%rcx), (%rax)
movl 8(%rbx), (%rcx)
movl x, (%rax)
movl 4(%rcx), x
![Page 33: Introdução ao Assembly - PUC-Rioinf1018/corrente/aulas/Assembly-Introducao.pdf · Introdução ao Assembly Movimentação de Dados Operações Aritméticas e Lógicas Noemi Rodriguez](https://reader036.fdocuments.net/reader036/viewer/2022062608/6085677590b01f2e3654922b/html5/thumbnails/33.jpg)
Movimentação com Extensão
Extensão com sinal (movs) ou com zeros (movz)
movs[bw][bl][bq][wl][wq][lq]
movz[bw][bl][bq][wl][wq] → não existe movzlq !
![Page 34: Introdução ao Assembly - PUC-Rioinf1018/corrente/aulas/Assembly-Introducao.pdf · Introdução ao Assembly Movimentação de Dados Operações Aritméticas e Lógicas Noemi Rodriguez](https://reader036.fdocuments.net/reader036/viewer/2022062608/6085677590b01f2e3654922b/html5/thumbnails/34.jpg)
Movimentação com Extensão
Extensão com sinal (movs) ou com zeros (movz)
movs[bw][bl][bq][wl][wq][lq]
movz[bw][bl][bq][wl][wq] → não existe movzlq !
movsbl (%r12), %eaxmovzbl %al, %ebxmovslq %ebx,%rcx
![Page 35: Introdução ao Assembly - PUC-Rioinf1018/corrente/aulas/Assembly-Introducao.pdf · Introdução ao Assembly Movimentação de Dados Operações Aritméticas e Lógicas Noemi Rodriguez](https://reader036.fdocuments.net/reader036/viewer/2022062608/6085677590b01f2e3654922b/html5/thumbnails/35.jpg)
Movimentação com Extensão
Extensão com sinal (movs) ou com zeros (movz)
movs[bw][bl][bq][wl][wq][lq]
movz[bw][bl][bq][wl][wq] → não existe movzlq !
movsbl (%r12), %eaxmovzbl %al, %ebxmovslq %ebx,%rcx
Instruções que escrevem um valor em registrador de 32 bits zeram a parte alta do registrador de 64 bits correspondente ...
![Page 36: Introdução ao Assembly - PUC-Rioinf1018/corrente/aulas/Assembly-Introducao.pdf · Introdução ao Assembly Movimentação de Dados Operações Aritméticas e Lógicas Noemi Rodriguez](https://reader036.fdocuments.net/reader036/viewer/2022062608/6085677590b01f2e3654922b/html5/thumbnails/36.jpg)
Operações Aritméticas: um operando
inc <dest>
dec <dest>
neg <dest>
registrador ou memória
![Page 37: Introdução ao Assembly - PUC-Rioinf1018/corrente/aulas/Assembly-Introducao.pdf · Introdução ao Assembly Movimentação de Dados Operações Aritméticas e Lógicas Noemi Rodriguez](https://reader036.fdocuments.net/reader036/viewer/2022062608/6085677590b01f2e3654922b/html5/thumbnails/37.jpg)
Operações Aritméticas: um operando
inc <dest>
dec <dest>
neg <dest>
registrador ou memória
incl %eax /* %eax = %eax + 1 */ incl (%rdx) /* (%rdx) = (%rdx) + 1 */ decl %eax /* %eax = %eax – 1 */negl %ebx /* %ebx = -%ebx */
![Page 38: Introdução ao Assembly - PUC-Rioinf1018/corrente/aulas/Assembly-Introducao.pdf · Introdução ao Assembly Movimentação de Dados Operações Aritméticas e Lógicas Noemi Rodriguez](https://reader036.fdocuments.net/reader036/viewer/2022062608/6085677590b01f2e3654922b/html5/thumbnails/38.jpg)
Operações Aritméticas: dois operandos
add <s>,<d>
sub <s>,<d>
imul <s>,<d>
d = d [ + - * ] s
nunca memória com memória !
![Page 39: Introdução ao Assembly - PUC-Rioinf1018/corrente/aulas/Assembly-Introducao.pdf · Introdução ao Assembly Movimentação de Dados Operações Aritméticas e Lógicas Noemi Rodriguez](https://reader036.fdocuments.net/reader036/viewer/2022062608/6085677590b01f2e3654922b/html5/thumbnails/39.jpg)
Operações Aritméticas: dois operandos
add <s>,<d>
sub <s>,<d>
imul <s>,<d>
d = d [ + - * ] s
nunca memória com memória !
addl %ebx, %eax /* %eax = %eax + %ebx */ addq $4, %rbx /* %rbx = %rbx + 4 */ addl 4(%r12), %eax /* %eax = %eax + 4(%r12) */subl %ebx, %eax /* %eax = %eax - %ebx */imull %ebx, %eax /* %eax = %eax * %ebx */
![Page 40: Introdução ao Assembly - PUC-Rioinf1018/corrente/aulas/Assembly-Introducao.pdf · Introdução ao Assembly Movimentação de Dados Operações Aritméticas e Lógicas Noemi Rodriguez](https://reader036.fdocuments.net/reader036/viewer/2022062608/6085677590b01f2e3654922b/html5/thumbnails/40.jpg)
Operações Lógicas (bit a bit)
and <s>,<d>
or <s>,<d>
xor <s>,<d>
d = d [ & | ^ ] s
nunca memória com memória !
![Page 41: Introdução ao Assembly - PUC-Rioinf1018/corrente/aulas/Assembly-Introducao.pdf · Introdução ao Assembly Movimentação de Dados Operações Aritméticas e Lógicas Noemi Rodriguez](https://reader036.fdocuments.net/reader036/viewer/2022062608/6085677590b01f2e3654922b/html5/thumbnails/41.jpg)
Operações Lógicas (bit a bit)
and <s>,<d>
or <s>,<d>
xor <s>,<d>
d = d [ & | ^ ] s
nunca memória com memória !
andl $0x7FFFFFFF,%eax /* %eax = %eax & 0x7FFFFFFF */andl %ebx,%eax /* %eax = %eax & %ebx */orl (%rcx),%eax /* %eax = %eax | (%rcx) */xorl %eax,%ebx /* %ebx = %ebx ^ %eax */
![Page 42: Introdução ao Assembly - PUC-Rioinf1018/corrente/aulas/Assembly-Introducao.pdf · Introdução ao Assembly Movimentação de Dados Operações Aritméticas e Lógicas Noemi Rodriguez](https://reader036.fdocuments.net/reader036/viewer/2022062608/6085677590b01f2e3654922b/html5/thumbnails/42.jpg)
Deslocamento (shift)
shl <i>,<d>
shr<i>,<d>
sar <i>,<d>
d = d << id = d >> i (lógico)d = d >> i (aritmético)
![Page 43: Introdução ao Assembly - PUC-Rioinf1018/corrente/aulas/Assembly-Introducao.pdf · Introdução ao Assembly Movimentação de Dados Operações Aritméticas e Lógicas Noemi Rodriguez](https://reader036.fdocuments.net/reader036/viewer/2022062608/6085677590b01f2e3654922b/html5/thumbnails/43.jpg)
Deslocamento (shift)
shl <i>,<d>
shr<i>,<d>
sar <i>,<d>
d = d << id = d >> i (lógico)d = d >> i (aritmético)
shll $2,%eax /* %eax = %eax << 2 */shrl $16,%eax /* %eax = %eax >> 16 (lógico) */sarl $3,%ebx /* %ebx = %ebx >> 3 (aritmético) */