Семинары по курсу «Архитектура ЭВМ и язык ассемблера» учебно-методическое пособие. Часть 1. - Е.А. Кузьменкова_ В.С. Махнычев_ В.А. Падарян (1110587), страница 4
Текст из файла (страница 4)
Тогда в регистре EAX будет размещено число0x01020304.РешениеТребуемый порядок размещения байтов является обратным по отношению к тому,который получится при считывании 32-разрядного числа с адреса a.Необходимо сформировать число в регистре с обратным порядком байтов.Воспользуемся для этого вспомогательной статической переменной и переместимотдельные байты таким образом, что при считывании из нее двойного слова будетполучаться необходимый порядок байтов в регистре.18section .bsstmp resd 1sectiona dbb dbc dbd db.data1234section .textmov al, byte [a]mov byte [tmp + 3], almov al, byte [b]mov byte [tmp + 2], almov al, byte [c]mov byte [tmp + 1], almov al, byte [d]mov byte [tmp], almov eax, dword [tmp]Средства ввода/выводаДля считывания данных, вводимых с клавиатуры, и печати данных на экран(консоль) предлагается набор команд, определенных в файле io.inc.
Онипозволяют считывать и печатать числа в шестнадцатеричном и десятичномформате, строки и отдельные символы. Фактически, приведенные командыявляются макросами, содержащими обращения к функциям стандартнойбиблиотеки ввода/вывода языка Си.Таблица 1. Сводная таблица макросов ввода/вывода.Имя командыОписание макросаPRINT_UDEC size,dataВывод числовых данных заданных параметром data в10-чном представлении. Параметр size – число,указывающее размерность данность в байтах;PRINT_DEC size, data допускаются значения 1, 2, 4. В качестве параметра dataможет выступать числовая константа, символьнаяконстанта, имя переменной, имя регистра или адресноевыражение (без спецификатора размера данных впамяти).
Если задается регистр большего размера, тоберется заданное параметром size количество младшихразрядов. PRINT_UDEC интерпретирует число какбеззнаковое, PRINT_DEC — как знаковое.PRINT_HEX size, data Аналогично предыдущему, но данные выводятся в 16чном представлении.19Имя командыОписание макросаPRINT_CHAR chПечатается символ, заданный параметром ch. Вкачестве параметра может выступать числоваяконстанта, символьная константа, имя переменной, имярегистра или адресное выражение (без спецификатораразмера данных в памяти). Печатается всегдасодержимое 8 младших разрядов.PRINT_STRING dataПечать строки текста, оканчивающейся символом скодом 0.
В качестве параметра можно передаватьстроковую константу, имя переменной или адресноевыражение (без спецификатора размера данных впамяти). В случае печати строковой константы, наличиесимвола с кодом 0 в конце строки необязательно.NEWLINEМакрос переводит печать на новую строку.GET_UDEC size, dataВвод числовых данных в 10-чном представлении склавиатуры. Размер вводимых данных ограниченпараметром size, который задается числом (1, 2, 4).Введенные данные обрезаются соответствующимобразом. Параметр data – либо имя переменной, либоимя регистра, либо адресное выражение (безспецификатора размера данных в памяти). Еслизадается регистр большего размера, то старшиеразряды заполняются знаковым битом в случаеGET_DEC и нулями в случае GET_UDEC.
GET_UDECсчитывает беззнаковое число, GET_DEC — знаковое.Запрещается использовать в качестве параметрарегистр ESP.GET_DEC size, data20GET_HEX size, dataАналогично предыдущему, но данные задаются в 16чном представлении с префиксом 0x.GET_CHAR dataАналогично предыдущему, но происходит считываниеодного символа, нажатие Enter не требуется. Болеетого, нажатие Enter будет расцениваться как вводуправляющих символов 0xD 0xA.
Если параметр –регистр, размер которого больше 1 байта, значениесчитанного символа будет дополнено нулями.GET_STRING data,maxszВвод последовательности символов, оканчивающейсясимволом перевода строки (включая этот символ), ноне более чем maxsz символов. Параметр data – либоимя переменной, либо адресное выражение (безспецификатора размера данных в памяти). Параметрmaxsz – числовая константа.
В конец строкидобавляется символ с кодом 0.Пример 1-4 Hello, World!Требуется написать программу «Hello, World!» на языке ассемблера.РешениеПрограмма расширяет Пример 1-1: помимо секции .text, используется секцияинициализированных статических данных .data, в которой размещенапоследовательность байт с текстом (строка 4). Для ссылки на этупоследовательность используется имя str, после которого идет двоеточие.Наличие двоеточия в данном случае является обязательным, если его убратьассемблер при трансляции кода выдаст ошибку со следующей диагностикойhello.asm:4: error: comma, colon or end of line expectedОбъясняется эта ошибка тем, что набор команд IA-32 содержит команду смнемоническим именем str. Запись объявления данных с именем str безсимвола двоеточия делает для ассемблера эту строку неотличимой от строки скомандой str.
Исправить ситуацию можно либо поместив двоеточие после имени,либо использовать имена, не пересекающиеся с мнемоническими именамикоманд.%include 'io.inc'section .datastr: db `Hello, World!\n`, 0section .textglobal CMAINCMAIN:PRINT_STRING [str]MOV EAX, 0RET;;;;;;;;;;;;(1)(2)(3)(4)(5)(6)(7)(8)(9)(10)(11)(12)В записи значения строки используются обратные кавычки, что позволяет внестисимвол переноса строки непосредственно в последовательность байт.
Следуетотметить, что символ-ограничитель 0 должен явно дописываться в конец строк. Вслучае Си-кода этот символ автоматически добавляется компилятором, на уровнеязыка ассемблера это обязанность программиста.Последнее отличие от Примера 1-1 – наличие на строке 10 вызова командыPRINT_STRING. Ее аргументом является исполнительный адрес, ссылающийся на томесто памяти, где расположена строка «Hello, World!\n».21ЗадачиЗадачи, название которых подчеркнуто, снабжены ответом, приведенным в концепособия.Задача 1-1 Представление чиселРассматривается представление целых чисел в формате байта. Заполните всепустые ячейки таблицы, указав для каждого из приведенных чисел егопредставление в виде десятичного числа без знака, числа со знаком, а такжепредставление в виде шестнадцатеричного и двоичного кодов.Двоичноепредставление (байт)16-ричноепредставление (байт)Число десятичноесо знаком-67Число десятичноебез знака0111011028h135Задача 1-2 Определение переменныхДля каждой из указанных директив привести эквивалентную ей директиву, гденачальное значение переменной представлено в 16-ричном виде.sectiona dwb ddc dbd dwe ddf db.data-2076-1128256-15-100Задача 1-3 Директивы описания данныхИспользуя только директивы DB, привести описания, эквивалентные заданным.; aDW 185Ah; bDW 90; cDW 9000; dDW 10000, -10000; eDW 'AB'; fDW "NASM"; gDW "Hello"; hDW "w", "orld", "!"Задача 1-4 Ошибки в кодеДаны описания.22; iDD 97; jDD "x"; kDD 'CD'; lDD "Hello, world!"bwydresbreswreswresd1111Вычеркнуть синтаксически неверные инструкции.; amov; bmov; cmov; dmovb, 1byte [b], 1word [b], 1ax, bx; emov; fmov; gmov; hmovecx, cxbh, cldword [d], esibyte [w], ch; imov; jadd; ksub; lsubword[w], word[y]15, bxword [y], 8eax, dword [d]Задача 1-5 Определение значения регистраВыписать в шестнадцатеричном виде значение регистра EAX, после выполнениякаждой помеченной инструкции.
Следует отметить, что в каждойпоследовательности команд «а»-«ж» и «з»-«к» необходимо учитывать ужеимеющееся значение регистра EAX.sectiona dwb dwc dwd dw.data0xDEAD0xF00D0xCAFE0xBABEsection .textmovsx eax,movsx ax,movzx eax,movsx eax,movzx ax,movsx eax,movbx,movsx ax,wordbytewordbytebytewordwordbh[a +[b][c][b +[d +[b +[a +1] ;;;2] ;1] ;1] ;1] ;;(а)(б)(в)(г)(д)(е)(ж)23sectiona dwb dwc dwd dw.data0x0DEC0x4A6F0x79210xFEFFsection .textmovebx,moveax,movzx ax,movecx,moveax,movsx ax,moveax,bswap eaxdword-1bldworddwordcldword[b];;; (з)[a + 1] ;[b + 1] ;; (и)[c];; (к)Задача 1-6 Перемещение данныхПривести фрагмент кода, осуществляющего пересылку данных, как это указанно нарисунке.242.Арифметика и целочисленные типы данныхОсновные арифметические операции реализуются в языке ассемблераинструкциями ADD, SUB, NEG, MUL/IMUL, DIV/IDIV.
Помимо того, операцииуменьшения и увеличения числа на единицу поддержаны инструкциями DEC и INC.Сложение и вычитание чисел большей длины, чем размер регистров поддержаноинструкциями ADC и SBB. В определенных случаях для более быстрого вычисленияарифметических выражений допустимо использовать инструкцию LEA.Выполнение арифметических операций сопровождается выработкой флаговрегистра EFLAGS: CF – перенос, OF – переполнение, SF – знак, ZF – ноль, PF –четность.Таблица 2. Коды описания флагов .TMПустоЗначение флага влияет на выполнение инструкцииИнструкция меняет флаг (устанавливает или сбрасывает, в зависимостиот операндов)Влияние инструкции на флаг не определеноИнструкция не влияет на флагТаблица 3. Перекрестные ссылки регистра флагов.ADC,ADD,MUL,DIV,DEC,MOV,SBBSUB, NEGIMULIDIVINCXCHG, MOVSX, MOVZX, LEAOFSFZFPFCFMMMMMMMMMMMMMTMMM-Машинные данные и типы данных языка СиОбъявление переменной в ассемблерной программе требует указания объемавыделяемой памяти.
Интерпретация содержимого переменной определяетсяисключительно кодом операции.Перевод выражений языка Си на язык ассемблера сопровождается реализациейприведений типов, которые явно или неявно присутствуют в вычислениях.Приведение целочисленных типов языка Си можно реализовать путем расширенияразмера данных при пересылке значений с помощью команд MOVZX и MOVSX. Приэтом команда MOVZX выполняет беззнаковое расширение данных (число донужного размера дополняется слева нулями), а команда MOVSX – знаковое25расширение данных (число до нужного размера дополняется слева битами созначением знакового разряда исходного числа, т.е.