Особенности программирования на языке Assembler
Исследование общих принципов программирования на языке Assembler для 32-х разрядных и 64-х разрядных процессоров. Изучение основных отличий архитектур i686 и amd64. Работа со стеком. Передача параметров в функции. Смена способа адресации внутри программы.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | контрольная работа |
Язык | русский |
Дата добавления | 10.02.2015 |
Размер файла | 118,2 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Оглавление
Введение
1. Основные отличия архитектур i686 и amd64
2. Общие принципы программирования на языке Assembler для платформ i686 и amd64
Регистры
Принцип передачи параметров в функции
Работа со стеком
Адресация
3. Листинг программы для сравнения архитектур i686 и amd64
4. Пример работы программы
5. Сравнение программ
Вывод
Список литературы
Введение
В нашу жизнь уже давно вошли процессоры с 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-х разрядной системе.
// Передача в регистр одного числа
movq %rbx, %rax
Листинг 2. Передача данных в 32-х разрядной системе.
// Передача в регистр одного числа
movl %ebx, %eax
Если число такого объема передавать не требуется, то мы можем в одном регистре передать несколько меньших чисел. Такой ход можно сделать на обеих архитектурах, но в случае 64-х разрядной архитектуры, объем данных, передаваемых за один такт, будет все равно больше, чем на 32-х разрядной архитектуре.
Листинг 3. Передача нескольких данных в одном регистре (64-х разрядная система).
// Передача в регистр трех чисел
movl %ecx, %eax
shlq $32, %rax
movw %dx %ax
shll $16, %eax
movw %bx, %ax
Листинг 4. Передача нескольких данных в одном регистре (32-х разрядная система).
// Передача в регистр трех чисел
movw %cx, %ax
5shll $16, %eax
movb %dl, %al
shlw $8, %ax
movb %bl, %al
Можно заметить, что, несмотря на то, что в обоих примерах было передано три числа в одном регистре, в случае использования 64-х разрядной архитектуры данные числа имеют большую разрядность, чем при использовании 32-х разрядной архитектуры.
Принцип передачи параметров в функции
С введением 64-х разрядной архитектуры был изменен способ передачи параметров в функции. Если, в случае 32-х разрядной архитектуры, параметры можно было передавать либо через стек, либо через регистры, то при использовании 64-х разрядной архитектуры первые четыре параметра (параметры должны быть целочисленными, указатель на класс (объектно-ориентированное программирование) считается целым числом и всегда помещается в регистр RCX) передаются через регистры RCX, RDX, R8, R9, а остальные через стек.
Листинг 5. Передача параметров в функцию в 64-х разрядной системе.
// Вызов функции с пятью аргументами
movq 5, dword ptr [%rsp+0x20] // Передаем пятый аргумент через стек
movq 4, %r9 // Передаем четвертый аргумент
movq 3, %r8 // Передаем третий аргумент
movq 2, %rdx // Передаем второй аргумент
movq 1, %rax // Передаем первый аргумент
call func // Вызываем функцию
func:
// …
// Код функции …
// …
addq 0x20, %rsp // Очищаем стек
ret // Возвращаем управление
Листинг 6. Передача параметров в функцию в 32-х разрядной системе.
// Вызов функции с пятью аргументами
pushl 5
pushl 4
pushl 3
pushl 2
pushl 1
call func
func:
// …
// Код функции …
Ret
Работа со стеком
В 64-разрядной архитектуре один элемент стека является 64-разрядным и меньшее значение туда положить нельзя. Стек выравнивается по границе в 16 Б, а не 8 Б в случае 32-разрядной архитектуры. Все остальные параметры работы со стеком остаются прежними, кроме того, что в 64-х разрядной архитектуре чаще всего применяется парадигма «резервирование пространства и повторное использование его», и именно из-за этого вызываемая функция не занимается чисткой стека. Этим должен заниматься вызывающий. При вызове функции обязательно должны сохраняться все регистры, кроме RAX, RCX, RDX, R8, R9, R10 и R11.
Адресация
программирование процессор архитектура адресация
Смена архитектуры никак не повлияла на смену способа адресации внутри программы. Адресация в 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)
3. Листинг программы для сравнения архитектур 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
4. Пример работы программы
Рисунок 1. Пример работы простейшей программы шифрования текста на архитектуре amd64.
Рисунок 2. Пример работы простейшей программы шифрования текста на архитектуре i686.
5. Сравнение программ
На таком простом примере сложно заметить прирост производительности «на глаз», но пример с шифрованием и дешифрованием данных был выбран неслучайно.
В большинстве алгоритмов шифрования и дешифрования данных, а также при составлении хэш-сумм требуется использование 64-х или более разрядных данных. Анализируя исходный код в примерах можно заметить, что использование 64-х разрядной архитектуры позволяет за один такт передать большее количество данных, а следовательно увеличить скорость работы алгоритма. При использовании многопоточных программ данный выигрыш будет заметен еще больше.
Вывод
В ходе выполнения данной работы был проведен сравнительный анализ основных отличий программирования на 32-х и 64-х разрядном ассемблерах.
Данный анализ показал, что использование 64-х разрядной архитектуры позволяет выполнять большинство задач быстрее, чем на 32-х разрядной архитектуре, но требует большего количество ресурсов компьютера и переучивания программиста. Стоит заметить, что для небольших математических задач и большинства бытовых возможностей 32-х разрядной архитектуры на данный момент хватает, но на данный момент стоит задуматься о том, чтобы уже делать приоритет на подготовку программистов для 64-х разрядных аппаратных платформ.
Список литературы
1. Ассемблер в Linux для программистов C http://ru.wikibooks.org/wiki/Ассемблер_в_Linux_для_программистов_C
2. Все, что нужно знать, чтобы начать программировать для 64-разрядных версий Windows, http://msdn.microsoft.com/ru-ru/library/dd335933.aspx
3. Архитектура x86-64 под скальпелем ассемблерщика, http://www.insidepro.com/kk/072/072r.shtml
4. Битва технологий: x64 против x86, http://www.platform64.net/x64blog/x64_soft/bitva_tehnologiy_x64_protiv_x86.h tml
5. Сравнение производительности веб-браузеров x86 и x64, http://www.platform64.net/x64blog/x64_soft/sravnenie_proizvoditelnosti_veb_br auzerov_x86_i_x64.html
6. Что лучше установить на ноутбук: Windows x86 или x64, http://www.interface.ru/home.asp?artId=23789
7. Ассемблер в UNIX (мини-FAQ), http://www.insidepro.com/kk/209r.shtml
8. История соглашений вызова, часть 5: amd64, http://www.transl-gunsmoker.ru/2008/12/5-amd64.html
9. От С к Ассемблеру (gcc assembler), http://www.opennet.ru/base/dev/from_c_to_asm.txt.html
Размещено на Allbest.ru
Подобные документы
Рассмотрение основных особенностей компьютерной программы Assembler: функции, структурное описание. Характеристика собственных векторов обработчиков прерываний. Div64 как функция-вычислитель, реализующая операцию деления знаковых чисел в формате 64:16.
контрольная работа [224,7 K], добавлен 11.03.2013Разработка программы на языке Assembler, отсчитывающую время от заданного значения до 0. Осуществление ввода с помощью стандартной шестнадцатикнопочной терминальной клавиатуры, подключаемой к параллельному порту (P1). Логика построения программы.
курсовая работа [188,8 K], добавлен 15.08.2009Составление программы, реализующей моделирование операции умножения, начиная со старших разрядов множителя, при сдвиге суммы частичного произведения влево и неподвижным множителем. Особенности реализации программы на алгоритмическом языке Assembler.
курсовая работа [26,9 K], добавлен 25.05.2014Описание функций, использующихся в программах. Основы 32-битного программирования на языке Assembler для ОС WINDOWS. Использование функции invoke, которая позволяет намного сократить текст программы и делает приложения похожими на программы для "ЯВы".
курсовая работа [252,6 K], добавлен 20.02.2015Структурная схема микроконтроллера, процесс разработки принципиальной схемы и программного обеспечения. Конфигурирование регистров аналого-цифрового преобразователя. Код программы на языке Assembler, конфигурирование регистров внешних прерываний.
курсовая работа [267,5 K], добавлен 08.06.2019Понятие и внутренняя структура показателей, имеющих отношений к основам программирования на алгоритмическом языке СИ: указатели и массивы, передача параметров по ссылке. Исследование примеров программ, иллюстрирующих работу с указателями и массивами.
лекция [134,4 K], добавлен 26.07.2013Характеристика основных принципов объектно-ориентированного программирования. Этапы разработки программы на языке C++, реализующей игру "Морской бой". Выбор языка программирования. Характеристика необходимых классов, наследований, виртуальных методов.
курсовая работа [657,6 K], добавлен 17.06.2012Особенности разработки и реализации обучающей программы и схемы алгоритмов на языке программирования С++. Понятие равномерной и неравномерной дискретизации. Представление информации (составление кода) в виде таблицы перекодировки или многочлена.
курсовая работа [704,6 K], добавлен 06.03.2013Стандартизированный процедурный язык программирования. Создание системного программного обеспечения и прикладных программ. Особенности языка Си, его основные недостатки. Передача параметров в функцию по значению. Стандартная библиотека языка Си.
презентация [396,3 K], добавлен 12.11.2012Исследование принципов объектно-ориентированного программирования на базе языка программирования С++. Разработка программного комплекса для ведения учёта памятников города. Описание процессов сортировки, поиска, формирования статистики по памятникам.
курсовая работа [782,4 K], добавлен 26.05.2014