Как вывести значение регистра ассемблер

Вывод значения регистра в MessageBox

Объясните пожалуйста как я могу вывести значение из регистра AL

Вывод значения из регистра BX
Пытаюсь записать регистр BL (где хранится количество единиц в двоичной записи числа) в переменную.

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

Вывод значения регистра на экран
Помогите пожалуйста разобраться с программой которая выводит значение(десятичное) регистра ax на.

Вывод значения регистра на экран
Как в FASM’e вывести на экран значение какого-нибудь регистра?

[MASM] Вывод значения переменной (или содержимого регистра) на экран
Здравствуйте! По очень простому вопросу никак не могу найти ответ. Например пара фрагментов.

Решение

79084897214, с какой целью вывести и куда?
Если просто посмотреть, что посчиталось, то проще всего это сделать отладчиком ( напр., для windows это могут быть x64dbg, windbg или отладчик, встроенный в Microsoft Visual Studio ).

Без отладчика проще всего вернуть значение в вызывающую программу.
64-разрядная программулька:

Решение

Чтобы перевести число в строку предусмотрена функция wsprintf() из либы kernel32.dll. В первом аргументе указываешь адрес приёмного буфера для результата, а во-втором — требуемый формат в виде спецификаторов. Можно выводить в любых системах счисления, кроме BIN. Вот пример на fasm’e:

Источник

Assembler: идеальный вывод содержимого регистров. [закрыт]

Хотите улучшить этот вопрос? Переформулируйте вопрос так, чтобы он был сосредоточен только на одной проблеме.

Закрыт 11 месяцев назад .

Допустим, будем обсуждать вывод значения регистра AX в шестнадцатеричном беззнаковом формате (можно и в другом, просто в этом, как мне кажется, будет быстрее). Я представляю много способов написать такую процедуру, к примеру, для masm32:

Выглядит не лучшим образом. Поэтому я бы хотел увидеть код, которым бы вы (люди разбирающиеся в ассемблере лучше меня) стали выводить содержимое регистра AX. Я понимаю, что можно написать программу либо с упором на место занимаемое ею в памяти, либо на ее скорость, но всё же, если бы у вас была задача написать универсальный вывода AX на экран — как бы это выглядело?

2 ответа 2

Когда-то давно решал такую задачу с условием минимального размера кода. Получилось два варианта. Знание того, как отражаются результаты операций на флагах, могут помочь избежать лишних сравнений. Хотя, конечно, страдает читаемость и понятность кода.

Есть вариант без условия. Когда-то делал такое. Линейный алгоритм

Если ваш ассемблер aad 17 не понимает — пишем db 0D5h, 17; для aam 16 код db 0D4,16; , для bswap eax код db 0Fh, 0C8h; на последнюю команду акцентирую внимание — она хорошо подходит если вы пишете видео-декодер, там часто такое надо bswap. «сдвиг» означает что вместо сдвига используются более легкие команды, из-за которых младшие 8 бит оказываются на нужном месте, а не настоящий сдвиг который больше ЦП ест. С порядком цифр мог напутать, значения цифр будут те что надо.

10-тое прерывание ф-ция 0Eh выводит одну цифру. Работает как из под DOS так и в случае если нету OS. Можно выводить значения регистров если пишите загрузчик или свою OS.

Источник

Как вывести на экран значение регистра?

Помогите, не получается вывести на экран значение регистра cx, какие-то кракозябры только появляются

В отладчике видно, что значение регистра изменяется. Но на экран не выводится

Помощь в написании контрольных, курсовых и дипломных работ здесь.

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

Как вывести значение регистра BX?
Находится минимальный элемент в массиве, и число 100 делится на этот минимальный элемент. После.

Сложить два регистра и вывести значение на экран
Сложить два регистра и вывести значение на экран. fasm, os 64bit так понимаю mz не пойдет надо.

Вывести на экран содержимое регистра xmm
Здравствуйте. Нужно вывести на экран содержимое регистра xmm7, но при компиляции выдается ошибка.

R71MT, спасибо большое. объясните пожалуйста, а зачем эти строчки кода?

1) Читайте про знакогенератор видеоадаптера. Если коротко — один байт имеет значения от 0 до 255, в этот диапазон на аппаратном уровне подставляется каждому значению свой пиксельный рисунок. Занимается этим видеоадаптер писюка (в его память загружается данные для знакогенератора — пиксельные рисунки). Цифры лежат в диапазоне от 30h = «0» до 39h = «9». Но надо отметить, что это т.н. текстовый режим. Если речь идёт о графическом режиме — то там образы уже немного по другому строятся, и значений уже больше(для отображения всяких китайских-японских символов).
2) Подсказанный Вам код не совсем полный. Он без проблем выводит числа от 0 до 9 находящихся в младшем байте регистра CX. Сам регистр имеет размерность от 0 до 65535(десятичное). Но обычно смотрят и оперируют более компактной формой — шестнадцатеричной. Данный регистр занимает два байта. Один байт это от 0 до FFh. Видно что для полного решения Вашей задачи требуется:
а) вывести отдельно на печать старший, затем младший байт регистра CX.
б) выводить в шестнадцатеричном представлении. Но можно и в десятичном — на любителя, к слову.

удачи Вам
(круглый)
ЗЫ
Подсказка:
Буква «A» отстоит от «9» на 7 позиций в знакогенераторе. Значит код будет содержать ышо 3 команды для вывода 16ричного значения байта. И если это всё это оформить в подпрограмму, то её можно позвать два раза два раза

Источник

Ассемблер. Сегменты памяти и регистры

Обновл. 27 Сен 2021 |

Мы уже рассматривали на предыдущем уроке 3 секции, из которых состоят программы на ассемблере. Эти секции также представляют различные сегменты памяти. Что интересно, если вы замените ключевое слово section на segment , то получите тот же результат. Например:

Результат выполнения программы:

Сегменты памяти

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

Сегменты памяти:

Сегмент данных (data segment) — представлен секциями .data и .bss. Секция .data используется для объявления области памяти, где хранятся элементы данных для программы. Эта секция не может быть расширена после объявления элементов данных, и она остается статической во всей программе. Секция .bss также является секцией статической памяти, содержащей буферы для данных, которые будут объявлены в программе позже. Эта буферная память заполнена нулями.

Сегмент кода (code segment) — представлен секцией .text. Он определяет область в памяти, в которой хранятся коды инструкций. Это также фиксированная область.

Стек (stack) — это сегмент, который содержит значения данных, передаваемые в функции и процедуры в программе.

Регистры

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

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

Регистры процессора

В архитектуре IA-32 есть десять 32-битных и шесть 16-битных процессорных регистров. Регистры делятся на три категории:

Общие регистры (General Registers);

Регистры управления (Control Registers);

Сегментные регистры (Segment Registers).

В свою очередь, общие регистры делятся на следующие:

Регистры данных (Data Registers);

Регистры-указатели (Pointer Registers);

Индексные регистры (Index Registers).

Регистры данных

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

как полные 32-битные регистры данных: EAX, EBX, ECX, EDX;

нижние половины 32-битных регистров могут использоваться как четыре 16-битных регистра данных: AX, BX, CX и DX;

нижняя и верхняя половины вышеупомянутых четырех 16-битных регистров могут использоваться как восемь 8-битных регистров данных: AH, AL, BH, BL, CH, CL, DH и DL.

Некоторые из этих регистров данных имеют специфическое применение в арифметических операциях:

AX (primary accumulator) — используется для ввода/вывода и в большинстве арифметических операций. Например, в операции умножения один операнд сохраняется в регистре EAX/AX/AL в соответствии с размером операнда.

BX (base register) — используется при индексированной адресации.

CX (count register) — хранит количество циклов в повторяющихся операциях (также, как и регистры ECX и CX).

DX (data register) — используется в операциях ввода/вывода, а также с регистрами AX и DX для выполнения операций умножения и деления, связанных с большими значениями.

Регистры-указатели

Регистрами-указателями являются 32-битные регистры EIP, ESP и EBP и соответствующие им 16-битные регистры IP, SP и BP. Есть три категории регистров-указателей:

Указатель на инструкцию или команду (Instruction Pointer или IP) — 16-битный регистр IP хранит смещение адреса следующей команды, которая должна быть выполнена. IP в сочетании с регистром CS (как CS:IP) предоставляет полный адрес текущей инструкции в сегменте кода.

Указатель на стек (Stack Pointer или SP) — 16-битный регистр SP обеспечивает значение смещения в программном стеке. SP в сочетании с регистром SS (SS:SP) означает текущее положение данных или адреса в программном стеке.

Базовый указатель (Base Pointer или BP) — 16-битный регистр BP используется в основном при передаче параметров в подпрограммы. Адрес в регистре SS объединяется со смещением в BP, чтобы получить местоположение параметра. BP также можно комбинировать с DI и SI в качестве базового регистра для специальной адресации.

Индексные регистры

В процессоре существуют 32-битные индексные регистры ESI и EDI и их 16-битные версии: SI и DI. Все они используются в индексированной адресации, и, иногда, в операциях сложения/вычитания. Есть два типа индексных указателей:

Исходный индекс (Source Index или SI) — используется в качестве исходного индекса в строковых операциях.

Индекс назначения (Destination Index или DI) — используется в качестве индекса назначения в строковых операциях.

Регистры управления

Регистром управления является объединенный 32-битный регистр инструкций и 32-битный регистр флагов (регистр процессора, отражающий его текущее состояние). Многие инструкции включают в себя операции сравнения и математические вычисления, которые способны изменить состояния флагов, а некоторые другие условные инструкции проверяют значения флагов состояния, чтобы перенести поток управления в другое место.

Распространенные битовые флаги:

Флаг переполнения (Overflow Flag или OF) — указывает на переполнение старшего бита данных (крайнего левого бита) после signed арифметической операции.

Флаг направления (Direction Flag или DF) — определяет направление влево или вправо для перемещения или сравнения строковых данных. Если DF = 0 , то строковая операция идет слева направо, а когда DF = 1 — строковая операция идет справа налево.

Флаг прерывания (Interrupt Flag или IF) — определяет, будут ли игнорироваться или обрабатываться внешние прерывания (например, ввод с клавиатуры и т.д.). Он отключает внешнее прерывание, когда значение равно 0 , и разрешает прерывание, когда установлено значение 1 .

Флаг ловушка (Trap Flag или TF) — позволяет настроить работу процессора в одношаговом режиме.

Флаг знака (Sign Flag или SF) — показывает знак результата арифметической операции. Этот флаг устанавливается в соответствии со знаком элемента данных после выполнения арифметической операции. Знак определяется по старшему левому биту. Положительный результат сбрасывает значение SF в 0 , а отрицательный результат устанавливает его равным 1 .

Нулевой флаг (Zero Flag или ZF) — указывает результат арифметической операции или операции сравнения. Ненулевой результат сбрасывает нулевой флаг в 0 , а нулевой результат устанавливает его равным 1 .

Вспомогательный флаг переноса (Auxiliary Carry Flag или AF) — после выполнения арифметической операции содержит перенос от бита 3 до бита 4. Используется для специализированной арифметики. AF устанавливается, когда 1-байтовая арифметическая операция вызывает перенос из бита 3 в бит 4.

Флаг равенства (Parity Flag или PF) — указывает общее количество 1-битов в результате, полученном после выполнения арифметической операции. Чётное число 1-битов сбрасывает PF в 0 , а нечётное число 1-битов устанавливает PF равным 1 .

Флаг переноса (Carry Flag или CF) — после выполнения арифметической операции содержит перенос 0 или 1 из старшего бита (крайнего слева). Кроме того, хранит содержимое последнего бита операции сдвига или поворота.

В следующей таблице указано положение битовых флагов в 16-битном регистре флагов:

Флаг: O D I T S Z A P C
Бит №: 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

Сегментные регистры

Сегменты — это специфические части программы, которые содержат данные, код и стек. Есть три основных сегмента:

Сегмент кода (Code Segment или CS) — содержит все команды и инструкции, которые должны быть выполнены. 16-битный регистр сегмента кода или регистр CS хранит начальный адрес сегмента кода.

Сегмент данных (Data Segment или DS) — содержит данные, константы и рабочие области. 16-битный регистр сегмента данных или регистр DS хранит начальный адрес сегмента данных.

Сегмент стека (Stack Segment или SS) — содержит данные и возвращаемые адреса процедур или подпрограмм. Он представлен в виде структуры данных «Стек». Регистр сегмента стека или регистр SS хранит начальный адрес стека.

Кроме регистров CS, DS и SS существуют и другие регистры дополнительных сегментов — ES (Extra Segment), FS и GS, которые предоставляют дополнительные сегменты для хранения данных.

При написании программ на ассемблере, программе необходим доступ к ячейкам памяти. Все области памяти в сегменте относятся к начальному адресу сегмента. Сегмент начинается с адреса, равномерно делимого на десятичное 16 или на шестнадцатеричное 10. Таким образом, крайняя правая шестнадцатеричная цифра во всех таких адресах памяти равна 0 , которая обычно не хранится в сегментных регистрах.

Сегментные регистры хранят начальные адреса сегмента. Чтобы получить точное местоположение данных или команды в сегменте, требуется значение смещения. Чтобы сослаться на любую ячейку памяти в сегменте, процессор объединяет адрес сегмента в сегментном регистре со значением смещения местоположения.

Пример на практике

Посмотрите на следующую простую программу, чтобы понять, как используются регистры в программировании на ассемблере. Эта программа выводит 9 звёздочек с простым сообщением:

Источник

Читайте также:  Надо ли чистить язык от налета новорожденному
Оцените статью