Модераторы: Poseidon

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Assembler] Печать двоичного, представления констант 
V
    Опции темы
NEt_Hunter
Дата 18.10.2006, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 106
Регистрация: 9.10.2006
Где: Германия

Репутация: нет
Всего: нет



Помогите с курсовой. Ассем. не знаю.

Даны 3 константы с фиксированной точкой в формате слова. Показать их представление в памяти машины и написать на Ассемблере программу печати двоичного представления этих констант.

Если можно, очень прошу пишите с комментами.
PM MAIL ICQ   Вверх
MAKCim
Дата 19.10.2006, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 6
Всего: 207



Цитата

программу печати двоичного представления этих констант.

Код

.model SMALL
.data
    number    dw    1.2  ; твое число
.stack 100h
.code
LOCALS
main:
    push @data
    pop DS
    mov BX, number
    mov CX, 16
    mov AH, 2
@@L1:
    mov DL, 48
    rol BX
    adc DL, 0
    int 21h
    loop @@L1
    mov AX, 4C00h
    int 21h
end main


Это сообщение отредактировал(а) MAKCim - 19.10.2006, 14:57


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
NEt_Hunter
Дата 20.10.2006, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 106
Регистрация: 9.10.2006
Где: Германия

Репутация: нет
Всего: нет



Большое спасибо, Макс! Но я не пойму где эти три константы smile 
PM MAIL ICQ   Вверх
NEt_Hunter
Дата 26.10.2006, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 106
Регистрация: 9.10.2006
Где: Германия

Репутация: нет
Всего: нет



Никто не поможет с комментами к командам?  smile 
PM MAIL ICQ   Вверх
anwe
Дата 28.10.2006, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 748
Регистрация: 2.9.2006

Репутация: 9
Всего: 23



Начнем с теории.
Ну, если ты занимаешься программированием, значит знаешь, что все данные (переменные, константы) содержаться в двоичном виде. С байтом проблем нет. Он как есть так и представлен.
Если данные размером в слово заносятся в память, то они туда заносятся и держатся в "перевернутом" виде. Представь два байта. Мы, люди, будем их нумеровать 1-й и 2-й. Тогда младшие (правые) 8 битов числа размещаются в первом байте слова, а старшие 8 бит - во втором байте. Для наглядности пример:
число 1110011100011000 в нашем представлении в памяти будет иметь вид 0001100011100111.
Но есть особенность: так представляются данные именно в памяти, в регистре представление прямое. Значит, если считываем эти данные в регистр и просмотрим его, получим опять 1110011100011000.
Что получается? Если просто вывести занесенные из памяти данные через регистр, то результат получится правильный лишь в том смысле, что будут выведены те же данные, что и в памяти. Но они будут представлены в "нашем" виде. Поэтому из регистра надо выводить по одному биту, начиная с хвоста. Если трудно определить, где у регистра хвост, а где голова, (а может это вообще палка о двух концах  smile ) то просто скажу (напишу), что надо выводить по биту, начиная с самого правого.
Теперь ближе к коду. Основной его частью является цикл, выводящий данные по биту из регистра. Функция же, несущая основную нагрузку в этом цикле есть функция shr. Эта функция выполняет сдвиг, указанного в параметре регистра, на указанное число. Первый вышедший бит помещается во флаг CF. Его и выводим. Вот для наглядности:

          ____регистр______          __
         |1110011100011000| --> |CF|

          ________________          __
0 --> |0111001110001100| --> |0|
                                                     |
                                                     |
                                                     0
          ________________          __
0 --> |0011100111000110| --> |0|
                                                    |
                                                    |
                                                  00
          ________________          __
0 --> |0001110011100011| --> |0|
                                                    |
                                                    |
                                                000
и так далее.

Да, есть еще и отрицательные числа. Они представляются в дополнительном коде. Как его найти? Для слова это 65536 плюс твое отрицательное число. Что получается? Получается, что число -256 (к примеру) и число 65280 в двоичном виде будут выглядить одинаково. Ну, и они также представлены в памяти в перевернутом виде.
Собственно все. Лишь еще одно дополнение. Приведенный код - код exe-файла, размер которого 546 байт. Для такой простой задачи вполне подойдет com-файл. Его размер 160 байт. Он и приведен.
Код

    .model    tiny
    .code
    org    100h
start:
    mov    ah,09h        ;функция вывода строки на экран
    mov    dx,offset prigl    ;адрес приглашения
    int    21h        ;вывод
    mov    ah,09h
    mov    dx,offset con1
    int    21h        ;вывод пояснения 1
    mov    ah,02h        ;функция вывода символа
    mov    bx,const1    ;адрес 1-й константы
    mov    cx,10h        ;счетчик цикла = длине слова
    mov    di,3        ;счетчик для констант, их же 3
    jmp    l1
l2:
    mov    ah,09h
    mov    dx,offset con2
    int    21h
    mov    ah,02h
    mov    bx,const2    ;адрес 2-й константы
    mov    cx,10h
    jmp    l1
l3:
    mov    ah,09h
    mov    dx,offset con3
    int    21h
    mov    ah,02h
    mov    bx,const3    ;адрес 3-й константы
    mov    cx,10h
l1:
    mov    dx,30h        ;код символа "0"
    shr    bx,1        ;сдвиг вправо на один бит
    adc    dl,0        ;сложение с учетом флага CF, так как
                ;добавлется 0 ,то будет учитываться
                ;лишь значение флага
    int    21h
    loop    l1        ;и так 16 раз
    mov    ah,09h
    mov    dx,offset ctrl
    int    21h        ;перевод строки
    dec    di        ;уменьшение счетчика констант
    cmp    di,2        ;di=2?
    je    l2        ;да - переход для вывода 2-й константы
    cmp    di,1        ;di=1?
    je    l3        ;да - прыжок на вывод 1-й константы
    ret            ;иначе выход

const1    dw    6375
const2    dw    -256
const3    dw    65280
prigl    db    'Constants in computer memory:'
ctrl    db    0Dh,0Ah,'$'
con1    db    ' 6375 - ','$'
con2    db    ' -256 - ','$'
con3    db    '65280 - ','$'

end    start


Сам com-файл здесь

Это сообщение отредактировал(а) anwe - 28.10.2006, 17:01

Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  Constants.COM 0,16 Kb
PM MAIL   Вверх
MAKCim
Дата 28.10.2006, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 6
Всего: 207



Цитата

Собственно все. Лишь еще одно дополнение. Приведенный код - код exe-файла, размер которого 546 байт. Для такой простой задачи вполне подойдет com-файл. Его размер 160 байт. Он и приведен.

Насколько я вижу - тут com-программа, а не exe
Цитата

Если данные размером в слово заносятся в память, то они туда заносятся и держатся в "перевернутом" виде. 

На каждой платформк по-разному


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
anwe
Дата 28.10.2006, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 748
Регистрация: 2.9.2006

Репутация: 9
Всего: 23



Цитата
Насколько я вижу - тут com-программа, а не exe
 Правильно, тут и приведен com-файл.
А на счет
Цитата
На каждой платформк по-разному
Это я знаю, но тогда задание вообще - не задание. Я понял так, что именно на это и делался упор.
PM MAIL   Вверх
NEt_Hunter
Дата 31.10.2006, 07:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 106
Регистрация: 9.10.2006
Где: Германия

Репутация: нет
Всего: нет



Спасибо огромное!!! Теперь каждую строчку понял, но есть еще кое-что для полной завершении проги:
Нужно результат добавить в файл.  smile 
PM MAIL ICQ   Вверх
anwe
Дата 31.10.2006, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 748
Регистрация: 2.9.2006

Репутация: 9
Всего: 23



Драсти, о чё сразу не сказал?
Правильно ли я понял, что надо создать файл и записать представление эти констант туда?
PM MAIL   Вверх
NEt_Hunter
Дата 31.10.2006, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 106
Регистрация: 9.10.2006
Где: Германия

Репутация: нет
Всего: нет



Я думаю главное нужно было написать алгоритм проги, а результат оставил на потом. Там много нужно менять? smile 
PM MAIL ICQ   Вверх
anwe
Дата 1.11.2006, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 748
Регистрация: 2.9.2006

Репутация: 9
Всего: 23



Ну раз алгоритм.
Создаешь файл функцией 3Ch без специфических атрибутов, то есть сх=0, ds:dx - полное имя файла. Занес из регистра bx данные справа налево в буфер. Функцией 40h, где bx - идентификатор файла, полученный от функции 3Ch, cx - число байтов для записи, ds:dx - адрес буфера, откуда берешь данные, записываешь полученный результат. Функцией 3Eh, где bx - идентификатор файла, закрываешь файл.
И последнее, самое приятное: через проводник (или еще что-то) находишь свое творение, смотришь результат. smile 
PM MAIL   Вверх
NEt_Hunter
Дата 1.11.2006, 21:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 106
Регистрация: 9.10.2006
Где: Германия

Репутация: нет
Всего: нет



File DB ‘D:1.pas’,0

Код

MOV AH,3Ch
MOV CX,0
LEA DX, file
INT 21h
JC error MOV handle, AX
MOV BX, handle
MOV AH,40h
MOV CX, сколько байтов?
LEA DX,
INT 21h
MOV AH, 3Eh
MOV BX,handle
INT 21h


Я не совсем понял, допиши пожалуйста.  smile 


Это сообщение отредактировал(а) alexeis1 - 2.11.2006, 00:34
PM MAIL ICQ   Вверх
anwe
Дата 2.11.2006, 01:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 748
Регистрация: 2.9.2006

Репутация: 9
Всего: 23



Да все верно, почти.
Код

mov    ah,3Ch
xor    cx,cx
mov    dx,offset file
int    21h
jc    error
mov    handle, ax
mov    ah,40h
mov    cx,10h
mov    dx,offset bufer
mov    bx,handle
int    21h
mov    ah,3Eh
mov    bx,handle
int    21h

PM MAIL   Вверх
NEt_Hunter
Дата 2.11.2006, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 106
Регистрация: 9.10.2006
Где: Германия

Репутация: нет
Всего: нет



а bufer где объявлять?
PM MAIL ICQ   Вверх
anwe
Дата 2.11.2006, 20:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 748
Регистрация: 2.9.2006

Репутация: 9
Всего: 23



Как где, в конце:
Код

bufer       db   10h dup(?)
 что означает буфер размером в 10h байт неопределенных (пока не занесешь туда что-нибудь) данных.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0841 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.