Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Центр помощи > [Assembler] Печать двоичного |
Автор: NEt_Hunter 18.10.2006, 11:56 |
Помогите с курсовой. Ассем. не знаю. Даны 3 константы с фиксированной точкой в формате слова. Показать их представление в памяти машины и написать на Ассемблере программу печати двоичного представления этих констант. Если можно, очень прошу пишите с комментами. |
Автор: MAKCim 19.10.2006, 14:57 | ||||
|
Автор: NEt_Hunter 20.10.2006, 19:00 |
Большое спасибо, Макс! Но я не пойму где эти три константы ![]() |
Автор: NEt_Hunter 26.10.2006, 17:39 |
Никто не поможет с комментами к командам? ![]() |
Автор: anwe 28.10.2006, 17:00 | ||
Начнем с теории. Ну, если ты занимаешься программированием, значит знаешь, что все данные (переменные, константы) содержаться в двоичном виде. С байтом проблем нет. Он как есть так и представлен. Если данные размером в слово заносятся в память, то они туда заносятся и держатся в "перевернутом" виде. Представь два байта. Мы, люди, будем их нумеровать 1-й и 2-й. Тогда младшие (правые) 8 битов числа размещаются в первом байте слова, а старшие 8 бит - во втором байте. Для наглядности пример: число 1110011100011000 в нашем представлении в памяти будет иметь вид 0001100011100111. Но есть особенность: так представляются данные именно в памяти, в регистре представление прямое. Значит, если считываем эти данные в регистр и просмотрим его, получим опять 1110011100011000. Что получается? Если просто вывести занесенные из памяти данные через регистр, то результат получится правильный лишь в том смысле, что будут выведены те же данные, что и в памяти. Но они будут представлены в "нашем" виде. Поэтому из регистра надо выводить по одному биту, начиная с хвоста. Если трудно определить, где у регистра хвост, а где голова, (а может это вообще палка о двух концах ![]() Теперь ближе к коду. Основной его частью является цикл, выводящий данные по биту из регистра. Функция же, несущая основную нагрузку в этом цикле есть функция shr. Эта функция выполняет сдвиг, указанного в параметре регистра, на указанное число. Первый вышедший бит помещается во флаг CF. Его и выводим. Вот для наглядности: ____регистр______ __ |1110011100011000| --> |CF| ________________ __ 0 --> |0111001110001100| --> |0| | | 0 ________________ __ 0 --> |0011100111000110| --> |0| | | 00 ________________ __ 0 --> |0001110011100011| --> |0| | | 000 и так далее. Да, есть еще и отрицательные числа. Они представляются в дополнительном коде. Как его найти? Для слова это 65536 плюс твое отрицательное число. Что получается? Получается, что число -256 (к примеру) и число 65280 в двоичном виде будут выглядить одинаково. Ну, и они также представлены в памяти в перевернутом виде. Собственно все. Лишь еще одно дополнение. Приведенный код - код exe-файла, размер которого 546 байт. Для такой простой задачи вполне подойдет com-файл. Его размер 160 байт. Он и приведен.
Сам com-файл здесь |
Автор: MAKCim 28.10.2006, 17:13 | ||||
Насколько я вижу - тут com-программа, а не exe
На каждой платформк по-разному |
Автор: anwe 28.10.2006, 19:20 | ||||
А на счет
|
Автор: NEt_Hunter 31.10.2006, 07:54 |
Спасибо огромное!!! Теперь каждую строчку понял, но есть еще кое-что для полной завершении проги: Нужно результат добавить в файл. ![]() |
Автор: anwe 31.10.2006, 14:32 |
Драсти, о чё сразу не сказал? Правильно ли я понял, что надо создать файл и записать представление эти констант туда? |
Автор: NEt_Hunter 31.10.2006, 15:08 |
Я думаю главное нужно было написать алгоритм проги, а результат оставил на потом. Там много нужно менять? ![]() |
Автор: anwe 1.11.2006, 14:40 |
Ну раз алгоритм. Создаешь файл функцией 3Ch без специфических атрибутов, то есть сх=0, ds:dx - полное имя файла. Занес из регистра bx данные справа налево в буфер. Функцией 40h, где bx - идентификатор файла, полученный от функции 3Ch, cx - число байтов для записи, ds:dx - адрес буфера, откуда берешь данные, записываешь полученный результат. Функцией 3Eh, где bx - идентификатор файла, закрываешь файл. И последнее, самое приятное: через проводник (или еще что-то) находишь свое творение, смотришь результат. ![]() |
Автор: NEt_Hunter 1.11.2006, 21:21 | ||
File DB ‘D:1.pas’,0
Я не совсем понял, допиши пожалуйста. ![]() |
Автор: anwe 2.11.2006, 01:26 | ||
Да все верно, почти.
|
Автор: NEt_Hunter 2.11.2006, 15:01 |
а bufer где объявлять? |
Автор: anwe 2.11.2006, 20:29 | ||
Как где, в конце:
|
Автор: NEt_Hunter 6.11.2006, 13:14 | ||||
как я понял, создаю отдельный файл с этим кодом? ![]()
|
Автор: anwe 6.11.2006, 15:02 |
Да |
Автор: NEt_Hunter 7.11.2006, 07:17 |
Всем спасибо!!! |