
- •Введение
- •Основные отличия архитектур i686 и amd64
- •Общие принципы программирования на языке Assembler для платформ i686 и amd64
- •Регистры
- •Принцип передачи параметров в функции
- •Работа со стеком
- •Адресация
- •Листинг программы для сравнения архитектур i686 и amd64
- •Пример работы программы
- •Сравнение программ
- •Вывод
- •Список литературы
Листинг программы для сравнения архитектур i686 и 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 |
Листинг 9. Простейшая программа шифрования текста для архитектуры amd64. |
|
.text |
|
.globl |
crypt |
.type |
crypt, @function |
crypt: |
|
.LFB0: |
|
pushl |
%ebp |
9
movl %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
Листинг 10. Простейшая программа шифрования текста для архитектуры i686.
11