Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Отчеты по Курсовой Работе / Нургалиев Р.Р 8-78-3 Сравнение 32 и 64 разрядных ассемблеров.docx
Скачиваний:
36
Добавлен:
12.03.2015
Размер:
75.1 Кб
Скачать

Адресация

Смена архитектуры никак не повлияла на смену способа адресации внутри программы. Адресация в 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