Подготовка и отладка программы на языке ассемблер

Содержание

cpuid — это встроенная инструкция процессоров Intel Pentinum и выше (не поддерживается процессорами ниже 486) .Она используется для идентификации определенного типа ЦП.

Он может возвращать информацию об уровне ЦП, модели, шаге ЦП и строке ЦП, из этой команды также можно получить информацию о кеш-памяти ЦП и TLB.

Тип данных, возвращаемый CPUID, определяется в регистре EAX, а значение, возвращаемое инструкцией, сохраняется в регистрах EAX, EBX, ECX и EDX.

Возвращенная информация разделена на две части: основная информация и расширенная информация.

Когда EAX вводит параметры 0–3, он возвращает основную информацию о процессоре;

И введите 0x8000000 в ox800000x в EAX, он вернет информацию о расширении ЦП. Расширенная информация доступна только для процессоров Pentinum4 и более поздних версий.

Уровень ЦП Основная информация Расширенная информация
ЦП 486 и более ранних версий недоступны Недоступно
Pentium 0x1 Недоступно
Pentium Pro, Pentium 2 0x2 Недоступно

Урок 17. Язык ассемблера. Основы


Pentium 3 0x3 недоступен
Pentium 4 0x2 0x80000004
Xeon (Xeon) 0x2 0x80000004

Код

#cpuid.s Sample program to extract the processor Vendor ID .section .data output: .ascii «The processor Vendor ID is ‘xxxxxxxxxxxx’n» .section .text .globl _start _start: movl $0, %eax cpuid movl $output, %edi movl %ebx, 28(%edi) movl %edx, 32(%edi) movl %ecx, 36(%edi) movl $4, %eax movl $1, %ebx movl $output, %ecx movl $42, %edx int $0x80 movl $1, %eax movl $0, %ebx int $0x80

сборка

Используйте ассемблер GNU

#as -o cpuid.o cpuid.s

Используйте компоновщик GNU

#ld -o cpuid cpuid.o

отладка

Чтобы отлаживать программы на ассемблере, необходимо пересобрать код с помощью параметра -gstabs.

#as -gstabs -o cpuid.o cpuid.s

#ld -o cpuid cpuid.o

Используйте параметр -gstabs, чтобы добавить дополнительную информацию в исполняемый файл, чтобы вновь созданный файл был больше

Не используйте отладочную информацию, если в этом нет необходимости.

бегать

Запускаем внутри gdb

Запустите отладчик GNU, загрузите программу в память и запустите программу из gdb с помощью команды run (также возможно упрощенное r)

Видно, что запуск в отладчике аналогичен запуску непосредственно из командной строки.

Точка останова

При указании точек останова на языке ассемблера вы должны указать относительное положение ближайшей метки.В приведенном выше коде есть только одна метка, поэтому каждая точка останова должна быть указана в соответствии с _start.

break (упрощенный b) формат команды break * метка + смещение

имя функции разрыва

номер строки разрыва

Как программировать на Ассемблере в 2021 году

имя файла прерывания: номер строки

имя файла разрыва: имя функции

label — это метка в указанном исходном коде

смещение — это количество строк от метки, где он должен остановиться

Параметр * _start указывает точку останова, которая указывает код первой инструкции после тега _start.

запустить или (упрощенное r) запустить программу и остановиться на первом коде инструкции.

Единственный шаг

Используйте следующую (упрощенное n) или пошаговую (упрощенное s) команду для пошагового выполнения

Примечание: s перейдет в вызываемую функцию, аналогично F11 в VS, а n похоже на F10 в VS

Каждая команда next или step выполняет следующую строку кода

Продолжать работать

Используйте continue (или c), чтобы продолжить работу в обычном режиме, аналогично F5 в VS

Просмотр данных

info registers Просмотр значений всех регистров

print (или p) Отображение определенного регистра или значения переменной из программы

p $ eax Показать содержимое регистра

p / форматная переменная

p / t Отображается как двоичное число

p / o Отображается в виде восьмеричного числа

p / d Отображается как десятичное число

p / u Отображается как десятичное число без знака

p / x отображается как шестнадцатеричное число

p / c отображается в виде символов

p / s Отображение в виде строки

p / f десятичный с плавающей точкой

p / i Отображение на машинном языке (доступно только в команде x памяти дисплея)

Указатель программы можно записать как $ pc или $ eip, поскольку указатель программы в архитектуре Intel IA-32 называется eip.

x Отображение содержимого определенной области памяти

x / формат адреса

Команда x отображает значение определенной области памяти.

x формат команды x / nyz

n — количество отображаемых полей;

y — тот же формат вывода, что и предыдущий p

z — длина отображаемого поля:

h Половина слова (2 байта)

w Слово (4 байта) значение по умолчанию

g Двойное слово (8 байтов)

Здесь x / i означает отображение инструкций по сборке

Также есть команда disassemble disassemble (or disas)

disas Program counter

disas Начальный адрес Конечный адрес

Видно, что перед выполнением инструкции cpuid все регистры EBX, ECX и EDX равны 0, после чего они содержат значение из строки идентификатора производителя.

Используйте команду x, чтобы отобразить значение ячейки памяти, расположенной в первых 42 байтах выходной переменной (знак number name», эта команда распечатает адрес памяти указанного исходного кода во время выполнения, например:
(gdb) info line tst.c:func
Line 5 of «tst.c» starts at address 0x8048456 and ends at 0x804845d .
5)info break
Просмотрите информацию о точке останова.
6)info threads
, чтобы просмотреть информацию о потоке в запущенной программе.
7)info registers
Проверьте состояние реестра. (За исключением регистров с плавающей запятой)
8)info all-registers
Просмотрите состояние всех регистров. (Включая регистры с плавающей запятой)
9)info registers
Проверить состояние указанного регистра.

Читайте также:
Сброс программы стиральной машины хотпоинт аристон

Например: info регистрирует ebp

10) информационная рамка или i f
Эта команда распечатает более подробную информацию о текущем слое стека, но большинство из них являются внутренними во время выполнения.
адрес. Например: адрес функции, адрес вызывающей функции, адрес вызываемой функции, какая функция сейчас
, например язык программирования, адрес и значение параметра функции, адрес локальной переменной и т. д.

11)(gdb) disassemble func

disassemble может просматривать машинный код текущего выполнения исходной программы, эта команда
сбрасывает инструкции, находящиеся в настоящее время в памяти

Используйте команду list, чтобы распечатать исходный код программы

Вы можете использовать команду explore (для краткости x), чтобы просмотреть значение в адресе памяти.

x / 3uh 0x54320 означает, что содержимое считывается из адреса памяти 0x54320, h означает двойной байт как единицу, 3 означает три единицы, u означает отображение в шестнадцатеричном формате.

x / 48xw $ ebp Вы также можете отобразить регистр изменений таким же образом или использовать описанный выше метод для нажатия адреса регистра

Посмотреть процесс

Просмотр кадра стека

Все равно, только псевдоним

bt Показать все кадры стека

bt N Показать первые N кадров стека

bt -N отображает последние N кадров стека

bt full display stack frame + локальные переменные

bt full N То же, что и раньше

Монитор

Приостановить выполнение при изменении , где является константой или переменной и т. Д.

получено, приостановить операцию при изменении

приостанавливается при доступе

Удалить точку наблюдения

Изменить значение переменной

(gdb)set variable options=0

Команды GDB

1) Одношаговая отладка:

ni (nexti) выполнить следующую строку (в ассемблерном коде)

s (разница между step и n, s входит в функцию)

si (stepi) выполнить следующую строку (в ассемблерном коде)

u (до) выполняется до указанной строки

2) Продолжить операцию: c (продолжить или продолжить), пока не встретится следующая точка останова

3) Временная точка останова: tbreak действителен при первом обнаружении

4) Проверить переменную: выражение для отображения p (printf)

x Отображение содержимого памяти

5) Точка мониторинга: часы останавливаются при изменении значения точки мониторинга.

6) Просмотр стека: bt (backtrace, где) отображает содержимое всего стека.

f (рамка) выберите кадр стека для отображения

do (вниз) Выберите кадр стека, который будет отображаться в текущем вызываемом кадре стека

7) Посмотрите на установленные точки останова: ib (info break)

8) Установите точку останова: break (b)

break function, break line_number, break filename:line_number, break filename:function

info break Просмотр информации о точке останова.

9) Удалить точки останова: d (удалить), удалить + числовой идентификатор (доступно с пункта 7) (без параметров, удалить все точки останова), четкое использование соответствует пункту 8

10) Отключить точку останова: отключить + идентификатор значения (повторно включить включить)

11) Выход из функции при пошаговом режиме: конец

12) Выпрыгивать из петли при одиночном шаге: до

13) Условная точка останова: break break-arg if (условие), например: break main if argc> 1

14) Список команд точки останова (автоматически выполняется при достижении точки останова):

Команды номер точки останова Пример: команды 1

a) Добавьте молчание к командам и фильтруйте другой бесполезный вывод.

б) Если последняя команда — продолжить, продолжить автоматически.

Пример: команды 1

15) Просмотр локальных переменных: информация locals получает список значений всех локальных переменных в текущем стеке

16) Установить переменные: установить x = 12

17) Команда потока GDB:

а) информационные потоки (дает всю текущую информацию о потоках)

б) резьба 3 (переключить вид резьбы)

c) прервать 88 поток 3 (остановить выполнение, когда поток 3 достигнет строки 88 исходного кода)

d) break 88 thread 3 if x == y

e) поток применить все bt, просмотреть информацию о стеке всех потоков.

18) Вы можете использовать идентификатор процесса в качестве второго параметра для отладки запущенного процесса.

имя программы gdb 1234

19) Завершить пробеги до конца функции

20) поиск вперед (или fo) поиск вперед

21) generate-core-file (или gcore) Создать дамп ядра

22edit редактировать файл или функцию

23) каталог (или dir) в каталог

24) список (или l) отображение функции или строки

25) информация (или я) отображение информации

26) help (или h) показать помощь

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

2) Не включайте опцию оптимизации кода при отладке, иначе после оптимизации позиция набора точек останова может сильно отличаться от позиции после компиляции.

«Углубленное понимание компьютерных систем (2-е издание оригинальной книги)»

Более продвинутая отладка GDB:

GDB присоединяется к процессу
————————————————
Заявление об авторских правах: эта статья является оригинальной статьей блоггера CSDN «unix21». Она соответствует соглашению об авторских правах CC 4.0 BY-SA. Приложите ссылку на исходный источник и это заявление для повторной печати.
Исходная ссылка: https://blog.csdn.net/unix21/article/details/8450016

Интеллектуальная рекомендация

Развернуть проект node.js под управлением npm в vCloudLabs

vCloudLabs — это сервер облачных вычислений, предоставляемый WMWare, по аналогии с Heroku, вы можете загружать на сервер свои собственные приложения. Подробнее см. следующий пост http://www.iteye.com/.

VS2013 добавил модель данных сущности ОШИБКА: Компиляция и преобразование: не удалось найти файлы метаданных «EntityFramework.dll», «Microsoft.Data.Entity.Design.dll»

1. Откройте переменную среды: Ниже файл, на который указывает значение переменной VS120COMNTOOLS, не существует или внутри файла IDE нет (значение переменной может отличаться от моего, какой бы путь в.

Читайте также:
Программа устанавливает пароль на папку

Buuctf: Проблемы Платты

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

Недавно я делал игру на pygame, и было больно, что макет нельзя предварительно просмотреть, поэтому я сделал помощника по макету с PB

Программа использует множество операций с окнами данных, друзья, которые хотят подробно изучить dw, могут обратиться к Загрузка исходного кода программы:https://download.csdn.net/download/wosind/11217.

Tensorflow глубокое обучение на основе прогнозирования букв на основе RNN (одноразовая система с мульти -буквальным прогнозом)

существуетTensorFlow глубокое обучение Описание Описание Процесс расчета циркуляции и процесс расчета цикла (ультраугольный)иTensorflow глубокое обучение на основе прогнозирования букв на основе RNN (.

Источник: russianblogs.com

Компиляция, выполнение и отладка программы

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

Подготовка исходного текста программы выполняется с помощью любого текстового редактора. Файл с исходным текстом должен иметь расширение .asm . Трансляция исходного текста программы состоит в преобразовании предложений исходного языка в машинный код и выполняется с помощью транслятора с языка ассемблера.

В результате трансляции образуется объектный файл с расширением .OBJ . Опционально может генерироваться файл листинга программы с расширением .LST . Он содержит отчет о том, как скомпилировалась программа: исходный код, адреса команд (смещения в коде), объектный код (машинный код), имена сегментов, символы (переменные, процедуры, константы). Компоновка объектного файла выполняется с помощью программы компоновщика (редактора связей).

Компоновщик выполняет следующие функции: 1) подсоединяет к файлу с основной программой файлы с подпрограммами и настраивает связи между ними; 2) изменяет формат объектного файла и преобразует его в выполнимый файл, который может быть загружен в оперативную память и выполнен. В результате компоновки образуется исполняемый файл с расширением .EXE . Опционально создается файл перекрестных ссылок с расширением .MAP , который содержит следующую информацию по каждому сегменту программы: начальный адрес, конечный адрес, размер, тип сегмента. Отладка готовой программы может выполняться разными методами, выбор которых определяется структурой и функциями отлаживаемой программы. В целом наиболее удобно отлаживать программы с помощью какого-либо интерактивного отладчика, который позволяет выполнять отлаживаемую программу по шагам или точкам останова. Для удобства отладки на этапе компиляции добавляется отладочная информация, а на этапе линковки программы создается файл символов отладчика, имеющий расширение .PDB . Рассмотрим пример разработки программы вывода сообщения на экран. 1. Вызов командного интерпретатора ОС и настройка переменных окружения: %comspec% /k «»C:Program FilesMicrosoft Visual Studio 9.0VCvcvarsall.bat»» x86 2. Создание файла: notepad.exe hello.asm 3. Ввод исходного текста программы: .686 .model flat, stdcall ExitProcess PROTO :DWORD MessageBoxA PROTO :DWORD, :DWORD, :DWORD, :DWORD .data MsgBoxCaption db «First Program»,0

MsgBoxText db «HELLO!»,0 .code

main:
push
push offset MsgBoxCaption
push offset MsgBoxText
push
call MessageBoxA
push
call ExitProcess

END main Директива .686 определяет тип процессора, для которого создается программа. Директива MODEL указывает, что программа компилируется для защищенного режима работы процессора,а параметр STDCALL указывает, что будут вызываться функции ОС Windows. Директивы PROTO объявляют прототипы функций, которыеиспользуются впрограмме.

Команда push помещает параметры функции в стек, команда call вызывает функцию. Директива END указывает точку входа программы. 4. Компиляция программы c добавлением отладочной информации и созданием файла листинга: ml /c /Zi /Fl hello.asm 5. Создание исполняемого файла и линковка программы, импорт вызываемых функций из библиотек ОС, генерация файла перекрестных ссылок, генерация символов отладчика: link /OPT:REF /MAP /DEBUG hello.obj kernel32.lib user32.lib При линковке программы следует явно указывать библиотеки для используемых функций, так библиотека kernel32.lib содержит функцию ExitProcess, а функция вывода сообщения на экран MessageBox вызывается из библиотеки user32.lib 6. Исполнение: hello.exe 7. Отладка: devenv hello.exe Для выполнения программы по шагам нажмите комбинацию клавиш Alt+F10 (Step over) Задание: Создайте программу суммирования двух чисел и выполните ее по шагам.

Простые типы данных

Директивы определения данных Директивы определения данных служат для задания размеров и содержимого данных, используемых в программе. При их обработке в памяти резервируется место для данных в объектном файле программы. Директива определения данных имеет следующий формат: [идентификатор] [директива] значение[,значение…][ ;комментарий ] Идентификатор имя переменной, метка, значение которой соответствует смещению переменной относительно начала сегмента, в котором она расположена. В следующей таблице приведены директивы и их описание.

Директива Описание Размер, байт Тип данных, Си
db define byte 1 char
dw define word 2 short
dd define double word 4 int, float, long
dp define pointer 6
df define far pointer 6
dq define quad-word 8 double, long double
dt define ten bytes 10

Чтобы отличать двоичные числа от десятичных, в ассемблерных программах в конце каждого двоичного числа ставят букву b или B. Неявно любая совокупность цифр считается десятичным числом, но для явного указания этого можно ставить в конце букву d (D). Для отличия восьмеричных чисел в конце ставят q (Q), шестнадцатеричных – h (H).

Читайте также:
Программа как расставить мебель

При записи чисел, начинающихся с a, b, c, d, e, f, в начале приписывается цифра 0, чтобы не перепутать такое число с идентификатором. Режимы адресации Операнды команд могут находиться в памяти, в регистрах или в портах вводавывода. Где именно располагается операнд и по каким правилам вычисляется его физический адрес (если он расположен в памяти) определяет режим адресации.

Различают следующие режимы адресации: регистровый, непосредственный, прямой, косвенный. Третья группа включает, в сущности, целый ряд способов адресации. Они обычно носят названия: базовая, индексная, адресация по базе со сдвигом, адресация с масштабированием, адресация по базе с индексированием. Также существуют портовая, строковая и стековая адресации, но эти виды очень

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

В этом случае в тексте программы указывается название соответствующего регистра, например команда, копирующая в регистр EAX содержимое регистра EBX, записывается как mov eax,ebx Непосредственная адресация. Некоторые команды (все арифметические команды, кроме деления) позволяют указывать один из операндов непосредственно в тексте программы, например команда mov eax,2 помещает в регистр EAX число 2. Прямая адресация.

В команде указывается символическое обозначение ячейки памяти, над содержимым которой требуется выполнить операцию. mov eax,mas Содержимое байта памяти с символическим именем mas пересылается в регистр eax. Базовая и индексная адресация памяти. Относительный адрес ячейки памяти находится в регистре, обозначение которого заключается в квадратные скобки.

При использовании регистров EВХ или EВР адресацию называют базовой, при использовании регистров ESI или EDI – индексной. При адресации через регистры EBX, ESI, EDI в качестве сегментного регистра подразумевается DS; при адресации через EВР – регистр SS. Таким образом, косвенная адресация через регистр EВР предназначена для работы со стеком. mov eax, [ebx] Базовая и индексная адресации памяти со смещением. Относительный адрес операнда определяется суммой содержимого регистра (EВХ, EВР, ESI или EDI) и указанного в команде числа. mov еdх, [ebx+2] mov еdх, [ebx]+2 Адресация по базе с индексированием. В этом методе адресации смещение операнда в памяти вычисляется как сумма чисел, содержащихся в двух регистрах, и смещения, если оно указано. Все следующие команды – это разные формы записи одного и того же действия: mov еax,[ebx+esi+2] mov еax,[ebx][esi]+2 mov еax,[ebx+2][esi] mov еax,[ebx][esi+2] mov еax,2[ebx][esi]

в регистр EAX помещается слово из ячейки памяти со смещением, равным сумме чисел, содержащихся в EBX и ESI, и числа 2. Значительная часть рассмотренных выше способов адресации служит для обращения к ячейкам памяти. Таким образом, один и тот же конечный результат можно получить с помощью различных способов адресации. Однако команды с использованием различных методов адресации занимают различный объем памяти и выполняются за разное время. Поэтому тщательный выбор способов адресации позволяет оптимизировать программы по времени выполнения или требуемой памяти, а иногда и по тому, и по другому. Пример программы с различными типами данных, описанными в сегменте данных и их загрузка в регистры с использованием команды mov. .686 .model flat, stdcall ExitProcess PROTO :DWORD

.data db “Begin” ; строка символов
mes
x1 db 26 ; число 26 занимает 1 байт
x2 dw 257 ; число 257 занимает 1 слово
x3 dw 201h ; то же число в 16-ричной форме
x4 dw 1000000001b ; то же число в двоичной форме
x5 db 1,2,3,4 ; байтовый массив из 4 членов
x6 dd 0FFFFFFFFh ; максимальное целое число в двойном слове
x7 db 256 dup (27) ; массив из 256 байт, заполненным числом 27
x8 db 256 dup (?) ; исходное содержимое массива не имеет значения
x9 db 256 dup (“*”) ; символьный массив

.code mov eax, dword ptr [mes] mov ah, x1 mov ax, x2 main: push 0 call ExitProcess END main Если посмотреть сегмент данных программы (адрес первой переменной в памяти соответствет адресу начал сегмента данных) , то мы увидим, что для слов данных в памяти сначала расположен младший байт, а затем старший (littleendian byte order) . Символы строки хранятся в памяти в порядке их следования, т. е. первый символ имеет самый младший адрес, последний – самый старший. Задание: Создайте исходный модуль lab.asm , содержащий сегмент данных с переменными. Загрузите исполняемый модуль в отладчик и найдите в окне дампа памяти все объявленные переменные. Составьте слово из массива данных, представляющего собой алфавит, используя различные способы адресации.

Источник: studfile.net

Практическое руководство. отладку встроенного кода ассемблера

Область применения:yesVisual StudionoVisual Studio для Mac noVisual Studio Code

Отображаемые диалоговые окна и команды меню могут отличаться от описанных в справке в зависимости от действующих параметров или выпуска среды. Чтобы изменить параметры, в меню «Сервис» выберите команду «Импорт и экспорт параметров». Дополнительные сведения см. в разделе Сброс параметров.

В отладчике представлены два окна для отладки встроенного кода ассемблера — окно Дизассемблирование и окно Регистры.

Отладка встроенного кода ассемблера

  1. Используйте окно Дизассемблирование для просмотра инструкций ассемблера.
  2. Используйте окно Регистры для отображения содержимого регистров.

См. также

  • Безопасность отладчика
  • Отладка машинного кода

Источник: learn.microsoft.com

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru