Особенности программирования на языке Assembler

 

Оглавление


Введение

. Основные отличия архитектур i686 и amd64

. Общие принципы программирования на языке Assembler для платформ i686 и amd64

Регистры

Принцип передачи параметров в функции

Работа со стеком

Адресация

. Листинг программы для сравнения архитектур i686 и amd64

. Пример работы программы

. Сравнение программ

Вывод

Список литературы



Введение


В нашу жизнь уже давно вошли процессоры с 64-х разрядной архитектурой. Не смотря на то, что все еще активно используются 32-х разрядные процессоры, и что программ для них в разы больше, новая архитектура приобретает все больше поклонников. 64-х разрядные процессоры позволяют использовать больше ресурсов, чем 32-х разрядные, позволяют оперировать с большим количеством данных за единицу времени, что в свою очередь повышает скорость и точность вычислений . В тоже время использование 64-х разрядной архитектуры влечет за собой повышенное потребление оперативной памяти и некоторые проблемы с совместимостью программ, написанных, для 32-х разрядной архитектуры.

Можно предположить, что новая архитектура будет требовать других способов программирования, и это окажется правдой. Например, были изменены регистры, стек, правила передачи аргументов в функции и другое.

В данной работе будет приведено сравнение особенностей программирования для 32-х разрядных и 64-разрядных процессоров на языке ассемблера. В качестве ОС будет применяться операционная система Ubuntu 12.10 LTS, компилятор gcc. Также мы будем придерживаться AT&T нотации языка программирования Assembler.



1. Основные отличия архитектур i686 и amd64


Нововведения в архитектуре 64-х разрядных процессоров позволили значительно увеличить объем используемой памяти для одного ядра процессора .


Таблица 1. Общие ограничения на память

Характеристика32-разрядные модели64-х разрядные моделиВиртуальное адресное пространство (один роцесс)4 ГБ16 ТБВиртуальное адресное пространство (32-х разрядный процесс)2 ГБ (3 ГБ, при запуске системы с ключом /3GB)4 ГБВиртуальное адресное пространство (64-х разрядный процесс)-8 ТБПул подкачиваемой памяти (режим ядра)470 МБ128 ГБПул неподкачиваемой памяти (режим ядра)156 МБ128 ГБЭлемент системной таблицы страниц660-900 МБ128 ГБ

Также использование 64-х разрядной архитектуры позволяет обращаться к большему количеству регистров большего объема во время работы программы. Если при использовании 32-х разрядного режима мы могли обращаться к восьми 32-х разрядным регистрам общего назначения: EAX, EBX, ECX, EDX, EBP, ESI, EDI, ESP, к восьми 64-х разрядным регистрам для работы медиа данными и с числами с плавающей точкой: MMX0/FPR0, MMX1/FPR1, MMX2/FPR2, MMX3/FPR3, MMX4/FPR4, MMX5/FPR5, MMX6/FPR6, MMX7/FPR7, к флаговому 32-х разрядному регистру EFLAGS и к 32-х разрядному регистру-указателю на следующую инструкцию EIP, то в 64-х разрядном режиме у нас гораздо больше возможностей:

Регистры общего назначения были расширены до 64-х разрядов с сохранением старой структуры и получили названия RAX, RBX, RCX, 3RDX, RBP, RSI, RDI и RSP;

Были введены новые 64-х разрядные регистры в количестве восьми штук: R8, R9, R10, R11, R12, R13, R14, R15;

Флаговый регистр и регистр-указатель на следующую инструкцию процессора были расширены до 64-х разрядов и получили названия RFLAGS и RIP соответственно;

Было добавлено 16 128-разрядных медиа-регистров под названиями XMM0, XMM1, XMM2, XMM3, XMM4, XMM5, XMM6, XMM7, XMM8, XMM9, XMM10, XMM11, XMM12, XMM13, XMM14, XMM15.

Из вышесказанного можно сделать вывод о том, что использование 64-х разрядной архитектуры позволит более быстро, качественно и удобно решать поставленные как научные, так и общие задачи.

Стоит заметить, что результаты тестирования программ на различных платформах показывают, что в большинстве случаев использование 64-х разрядной архитектуры дает прирост производительности, по сравнению с 32-х разрядной архитектурой.



2. Общие принципы программирования на языке Assembler для платформ i686 и amd64


В данном разделе мы рассмотрим четыре основных вопроса, которые должны быть решены в первую очередь программистом на языке Assembler при переходе на новую аппаратную платформу: регистры, стек, передача параметров в функции и адресация.


Регистры


Использование 64-х разрядных регистров позволяет на единицу времени передавать гораздо больше информации. Если, в случае 32-х разрядной архитектуры, мы можем передать 32 бита информации за раз (максимальное число 4294967296), то в случае 64-х разрядной архитектуры мы можем передать максимальное значение, равное 18446744073709551616.

Листинг 1. Передача данных в 64-х разрядной системе.


// Передача в регистр одного числа%rbx, %rax


Листинг 2. Передача данных в 32-х разрядной системе.


// Передача в регистр одного числа%ebx, %eax


Если число такого объема передавать не требуется, то мы можем в одном регистре передать несколько меньших чисел. Такой ход можно сделать на обеих архитектурах, но в случае 64-х разрядной архитектуры, объем данных, передаваемых за один такт, будет все равно больше, чем на 32-х разрядной архитектуре.

Листинг 3. Передача нескольких данных в одном регистре (64-х разрядная система).


// Передача в регистр трех чисел

movl %ecx, %eax

shlq $32, %rax%dx %ax$16, %eax %bx, %ax


Листинг 4. Передача нескольких данных в одном регистре (32-х разрядная система).


// Передача в регистр трех чисел%cx, %ax

5shll $16, %eax%dl, %al$8, %ax

movb %bl, %al


Можно заметить, что, несмотря на то, что в обоих примерах было передано три числа в одном регистре, в случае использования 64-х разрядной архитектуры данные числа имеют большую разрядность, чем при использовании 32-х разрядной архитектуры.


Принцип передачи параметров в функции


С введением 64-х разрядной архитектуры был изменен способ передачи параметров в функции. Если, в случае 32-х разрядной архитектуры, параметры можно было передавать либо через стек, либо через регистры, то при использовании 64-х разрядной архитектуры первые четыре параметра (параметры должны быть целочисленными, указатель на класс (объектно-ориентированное программирование) считается целым числом и всегда помещается в регистр RCX) передаются через регистры RCX, RDX, R8, R9, а остальные через стек.

Листинг 5. Передача параметров в функцию в 64-х разрядной системе.


// Вызов функции с пятью аргументами5, dword ptr [%rsp+0x20] // Передаем пятый аргумент через стек4, %r9 // Передаем четвертый аргумент3, %r8 // Передаем третий аргумент2, %rdx // Передаем второй аргумент1, %rax // Передаем первый аргументfunc // Вызываем функцию:

// …

// Код функции …

// …

addq 0x20, %rsp // Очищаем стек

ret // Возвращаем управление


Листинг 6. Передача параметров в функцию в 32-х разрядной системе.


// Вызов функции с пятью аргументами5

pushl 4321func

func:

// …

// Код функции …

Ret


Работа со стеком


В 64-разрядной архитектуре один элемент стека является 64-разрядным и меньшее значение туда положить нельзя. Стек выравнивается по границе в 16 Б, а не 8 Б в случае 32-разрядной архитектуры. Все остальные параметры работы со стеком остаются прежними, кроме того, что в 64-х разрядной архитектуре чаще всего применяется парадигма «резервирование пространства и повторное использование его», и именно из-за этого вызываемая функция не занимается чисткой стека. Этим должен заниматься вызывающий. При вызове функции обязательно должны сохраняться все регистры, кроме RAX, RCX, RDX, R8, R9, R10 и R11.


Адресация

программирование процессор архитектура адресация

Смена архитектуры никак не повлияла на смену способа адресации внутри программы. Адресация в 64-х разрядной системе строится по тому же принципу, как и в 32-х разрядной, и команда обращения к адресу занимает одинаковое количество байт и тактов.

Листинг 7. Адресация в 64-х разрядной системе.


// Загрузка опкода следующей машинной команды[%rip], %al

// Абсолютная адресация

xorq %r9, %r9

decb byte ptr (%r9+$777h)


Листинг 8. Адресация в 32-х разрядной системе.


// Загрузка опкода следующей машинной команды$ + 5

popl %ebx$6, %ebx(%ebx), %al

nop

// Абсолютная адресацияbyte ptr ($777h)



3. Листинг программы для сравнения архитектур i686 и amd64


Листинг 9. Простейшая программа шифрования текста для архитектуры amd64..text


.globl crypt

.type crypt, @function :

.LFB0:%rbp%rsp, %rbp$32, %rsp %rdi, -24(%rbp) %rsi, -32(%rbp) $0, -16(%rbp) $0, -12(%rbp) -24(%rbp), %rax %rax, %rdi strlen %rax, %rdi malloc %rax, -8(%rbp) .L2

.L3: -16(%rbp), %eax %eax, %rdx -8(%rbp), %rax %rax, %rdx -16(%rbp), %eax %eax, %rcx -24(%rbp), %rax %rcx, %rax (%rax), %ecx -12(%rbp), %eax %eax, %rsi -32(%rbp), %rax %rsi, %rax (%rax), %eax %ecx, %eax %al, (%rdx) $1, -16(%rbp) $1, -12(%rbp) -12(%rbp), %eax %eax, %rdx -32(%rbp), %rax %rdx, %rax (%rax), %eax %al, %al .L2 $0, -12(%rbp)

.L2: -16(%rbp), %eax %eax, %rdx -24(%rbp), %rax %rdx, %rax (%rax), %eax %al, %al .L3 -8(%rbp), %rax

.LFE0:

.size crypt, .-crypt

.section .rodata

.LC0:

.string "Hello, World!"

.LC1:

.string "My_key111"

.LC2:

.string "--------------"

.text

.globl main

.type main, @function :

.LFB1:%rbp%rsp, %rbp$32, %rsp %edi, -20(%rbp) %rsi, -32(%rbp) $.LC0, -16(%rbp) $.LC1, -8(%rbp) -16(%rbp), %rax %rax, %rdi puts $.LC2, %edi puts -8(%rbp), %rdx -16(%rbp), %rax %rdx, %rsi %rax, %rdi crypt %rax, -16(%rbp) -16(%rbp), %rax %rax, %rdi puts -8(%rbp), %rdx -16(%rbp), %rax %rdx, %rsi %rax, %rdi crypt %rax, -16(%rbp) $.LC2, %edi puts -16(%rbp), %rax %rax, %rdi puts $0, %eax

.LFE1:

.size main, .-main


Листинг 10. Простейшая программа шифрования текста для архитектуры i686..text


.globl crypt

.type crypt, @function :

.LFB0: %ebp

movl %esp, %ebp %ebx $36, %esp $0, -12(%ebp) $0, -16(%ebp) 8(%ebp), %eax %eax, (%esp) strlen %eax, (%esp) malloc %eax, -20(%ebp) .L2

.L3: -12(%ebp), %edx -20(%ebp), %eax %eax, %edx -12(%ebp), %ecx 8(%ebp), %eax %ecx, %eax (%eax), %ecx -16(%ebp), %ebx 12(%ebp), %eax %ebx, %eax (%eax), %eax %ecx, %eax %al, (%edx) $1, -12(%ebp) $1, -16(%ebp) -16(%ebp), %edx 12(%ebp), %eax %edx, %eax (%eax), %eax %al, %al .L2 $0, -16(%ebp)

.L2: -12(%ebp), %edx 8(%ebp), %eax %edx, %eax (%eax), %eax %al, %al .L3 -20(%ebp), %eax $36, %esp %ebx %ebp

.LFE0:

.size crypt, .-crypt

.section .rodata

.LC0:

.string "Hello, World!"

.LC1:

.string "My_key111"

.LC2:

.string "--------------"

.text

.globl main

.type main, @function :

.LFB1: %ebp %esp, %ebp $-16, %esp $32, %esp $.LC0, 28(%esp) $.LC1, 24(%esp) 28(%esp), %eax %eax, (%esp) puts $.LC2, (%esp) puts 24(%esp), %eax %eax, 4(%esp) 28(%esp), %eax %eax, (%esp) crypt %eax, 28(%esp) 28(%esp), %eax %eax, (%esp) puts 24(%esp), %eax %eax, 4(%esp) 28(%esp), %eax %eax, (%esp) crypt %eax, 28(%esp) $.LC2, (%esp) puts 28(%esp), %eax %eax, (%esp) puts $0, %eax

.LFE1:

.size main, .-main



4. Пример работы программы


Рисунок 1. Пример работы простейшей программы шифрования текста на архитектуре amd64.


Рисунок 2. Пример работы простейшей программы шифрования текста на архитектуре i686.



5. Сравнение программ


На таком простом примере сложно заметить прирост производительности «на глаз», но пример с шифрованием и дешифрованием данных был выбран неслучайно.

В большинстве алгоритмов шифрования и дешифрования данных, а также при составлении хэш-сумм требуется использование 64-х или более разрядных данных. Анализируя исходный код в примерах можно заметить, что использование 64-х разрядной архитектуры позволяет за один такт передать большее количество данных, а следовательно увеличить скорость работы алгоритма. При использовании многопоточных программ данный выигрыш будет заметен еще больше.



Вывод


В ходе выполнения данной работы был проведен сравнительный анализ основных отличий программирования на 32-х и 64-х разрядном ассемблерах.

Данный анализ показал, что использование 64-х разрядной архитектуры позволяет выполнять большинство задач быстрее, чем на 32-х разрядной архитектуре, но требует большего количество ресурсов компьютера и переучивания программиста. Стоит заметить, что для небольших математических задач и большинства бытовых возможностей 32-х разрядной архитектуры на данный момент хватает, но на данный момент стоит задуматься о том, чтобы уже делать приоритет на подготовку программистов для 64-х разрядных аппаратных платформ.



Список литературы


1. Ассемблер в Linux для программистов C #"justify">. Все, что нужно знать, чтобы начать программировать для 64-разрядных версий Windows, #"justify">. Архитектура x86-64 под скальпелем ассемблерщика, #"justify">. Битва технологий: x64 против x86, #"justify">. Сравнение производительности веб-браузеров x86 и x64, #"justify">. Что лучше установить на ноутбук: Windows x86 или x64, #"justify">. Ассемблер в UNIX (мини-FAQ), #"justify">. История соглашений вызова, часть 5: amd64, #"justify">. От С к Ассемблеру (gcc assembler), http://www.opennet.ru/base/dev/from_c_to_asm.txt.html


Оглавление Введение . Основные отличия архитектур i686 и amd64 . Общие принципы программирования на языке Assembler для платформ i686 и amd64 Ре

Больше работ по теме:

Предмет: Информационное обеспечение, программирование

Тип работы: Контрольная работа

Новости образования

КОНТАКТНЫЙ EMAIL: MAIL@SKACHAT-REFERATY.RU

Скачать реферат © 2018 | Пользовательское соглашение

Скачать      Реферат

ПРОФЕССИОНАЛЬНАЯ ПОМОЩЬ СТУДЕНТАМ