O pentium suporta mais que uma forma de endereçamento. No curso vamos usar apenas o chamado modelo de memória plano (flat memory model), onde valores de 32 bits são usados para endereçar posições de 0 a 232.
Diversas instruções (soma, comparação, etc) precisam especificar operandos. Como isso pode ser feito?
Nos exemplos abaixo, a instrução movl
indica transferência
do dado indicado pelo primeiro operando para o segundo operando.
movl %eax, %ecxmove o conteúdo de
eax
para ecx
mov $0x0aabb0100, %eaxpreenche eax com o valor indicado
base (reg)(e outras formas mais complexas que não veremos em aula...)
movl %edx, (%eax)move conteúdo de edx para endereço armazenado em eax
mov %ebx, 16(%eax)
mov table, %ebxonde table é um símbolo: move para ebx o conteúdo do endereço table.
movl $table, %ebx
move para
ebx o endereço associado ao símbolo table, isto é, corta a indireção.
mov
(como várias outras)
possui o sufixo l
. O propósito deste é indicar o tamanho do operando:
b
- byte, como o nome indica o tamanho é de um byte.
movb $0, (%eax)
w
- word, tamanho de dois bytes.
movw $0, (%eax)
l
- long, tamanho de quatro bytes.
movl $0, (%eax)
.data
) do código fonte. Alguns exemplos:
vet: .byte 48, 0b00110000, 0x30, '0'define um array de bytes (apontado por vet) contendo quatro elementos.
S1: .string "o valor é igual a %d\n"define uma cadeia de caracteres (apontada por S1) contendo 21 bytes.
referência: CS:APP, seções 3.1, 3.2, 3.3, 3.4, 3.5.