
- •Оглавление
- •Введение
- •Основные отличия архитектур i686 и amd64
- •Общие принципы программирования на языке Assembler для платформ i686 и amd64
- •Регистры
- •Принцип передачи параметров в функции
- •Работа со стеком
- •Адресация
- •Листинг программы для сравнения архитектур i686 и amd64
- •Пример работы программы
- •Сравнение программ
- •Список литературы
Адресация
Смена архитектуры никак не повлияла на смену способа адресации внутри программы. Адресация в 64-х разрядной системе строится по тому же принципу, как и в 32-х разрядной, и команда обращения к адресу занимает одинаковое количество байт и тактов.
Листинг 7. Адресация в 64-х разрядной системе.
// Загрузка опкода следующей машинной команды
movb [%rip], %al
nop
// Абсолютная адресация
xorq %r9, %r9
decb byte ptr (%r9+$777h)
Листинг 8. Адресация в 32-х разрядной системе.
// Загрузка опкода следующей машинной команды
call $ + 5
popl %ebx
addl $6, %ebx
movb (%ebx), %al
nop
// Абсолютная адресация
decb byte ptr ($777h)
Листинг программы для сравнения архитектур i686 и amd64
Листинг 9. Простейшая программа шифрования текста для архитектуры amd64.
.text
.globl crypt
.type crypt, @function
crypt:
.LFB0:
pushq %rbp
movq %rsp, %rbp
subq $32, %rsp
movq %rdi, -24(%rbp)
movq %rsi, -32(%rbp)
movl $0, -16(%rbp)
movl $0, -12(%rbp)
movq -24(%rbp), %rax
movq %rax, %rdi
call strlen
movq %rax, %rdi
call malloc
movq %rax, -8(%rbp)
jmp .L2
.L3:
movl -16(%rbp), %eax
movslq %eax, %rdx
movq -8(%rbp), %rax
addq %rax, %rdx
movl -16(%rbp), %eax
movslq %eax, %rcx
movq -24(%rbp), %rax
addq %rcx, %rax
movzbl (%rax), %ecx
movl -12(%rbp), %eax
movslq %eax, %rsi
movq -32(%rbp), %rax
addq %rsi, %rax
movzbl (%rax), %eax
xorl %ecx, %eax
movb %al, (%rdx)
addl $1, -16(%rbp)
addl $1, -12(%rbp)
movl -12(%rbp), %eax
movslq %eax, %rdx
movq -32(%rbp), %rax
addq %rdx, %rax
movzbl (%rax), %eax
testb %al, %al
jne .L2
movl $0, -12(%rbp)
.L2:
movl -16(%rbp), %eax
movslq %eax, %rdx
movq -24(%rbp), %rax
addq %rdx, %rax
movzbl (%rax), %eax
testb %al, %al
jne .L3
movq -8(%rbp), %rax
leave
ret
8.LFE0:
.size crypt, .-crypt
.section .rodata
.LC0:
.string "Hello, World!"
.LC1:
.string "My_key111"
.LC2:
.string "--------------"
.text
.globl main
.type main, @function
main:
.LFB1:
pushq %rbp
movq %rsp, %rbp
subq $32, %rsp
movl %edi, -20(%rbp)
movq %rsi, -32(%rbp)
movq $.LC0, -16(%rbp)
movq $.LC1, -8(%rbp)
movq -16(%rbp), %rax
movq %rax, %rdi
call puts
movl $.LC2, %edi
call puts
movq -8(%rbp), %rdx
movq -16(%rbp), %rax
movq %rdx, %rsi
movq %rax, %rdi
call crypt
movq %rax, -16(%rbp)
movq -16(%rbp), %rax
movq %rax, %rdi
call puts
movq -8(%rbp), %rdx
movq -16(%rbp), %rax
movq %rdx, %rsi
movq %rax, %rdi
call crypt
movq %rax, -16(%rbp)
movl $.LC2, %edi
call puts
movq -16(%rbp), %rax
movq %rax, %rdi
call puts
movl $0, %eax
leave
ret
.LFE1:
.size main, .-main
Листинг 10. Простейшая программа шифрования текста для архитектуры i686.
.text
.globl crypt
.type crypt, @function
crypt:
.LFB0:
pushl %ebp
9movl %esp, %ebp
pushl %ebx
subl $36, %esp
movl $0, -12(%ebp)
movl $0, -16(%ebp)
movl 8(%ebp), %eax
movl %eax, (%esp)
call strlen
movl %eax, (%esp)
call malloc
movl %eax, -20(%ebp)
jmp .L2
.L3:
movl -12(%ebp), %edx
movl -20(%ebp), %eax
addl %eax, %edx
movl -12(%ebp), %ecx
movl 8(%ebp), %eax
addl %ecx, %eax
movzbl (%eax), %ecx
movl -16(%ebp), %ebx
movl 12(%ebp), %eax
addl %ebx, %eax
movzbl (%eax), %eax
xorl %ecx, %eax
movb %al, (%edx)
addl $1, -12(%ebp)
addl $1, -16(%ebp)
movl -16(%ebp), %edx
movl 12(%ebp), %eax
addl %edx, %eax
movzbl (%eax), %eax
testb %al, %al
jne .L2
movl $0, -16(%ebp)
.L2:
movl -12(%ebp), %edx
movl 8(%ebp), %eax
addl %edx, %eax
movzbl (%eax), %eax
testb %al, %al
jne .L3
movl -20(%ebp), %eax
addl $36, %esp
popl %ebx
popl %ebp
ret
.LFE0:
.size crypt, .-crypt
.section .rodata
.LC0:
.string "Hello, World!"
.LC1:
.string "My_key111"
.LC2:
.string "--------------"
.text
.globl main
.type main, @function
main:
10.LFB1:
pushl %ebp
movl %esp, %ebp
andl $-16, %esp
subl $32, %esp
movl $.LC0, 28(%esp)
movl $.LC1, 24(%esp)
movl 28(%esp), %eax
movl %eax, (%esp)
call puts
movl $.LC2, (%esp)
call puts
movl 24(%esp), %eax
movl %eax, 4(%esp)
movl 28(%esp), %eax
movl %eax, (%esp)
call crypt
movl %eax, 28(%esp)
movl 28(%esp), %eax
movl %eax, (%esp)
call puts
movl 24(%esp), %eax
movl %eax, 4(%esp)
movl 28(%esp), %eax
movl %eax, (%esp)
call crypt
movl %eax, 28(%esp)
movl $.LC2, (%esp)
call puts
movl 28(%esp), %eax
movl %eax, (%esp)
call puts
movl $0, %eax
leave
ret
.LFE1:
.size main, .-main