Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [Assembler] Печать двоичного


Автор: NEt_Hunter 18.10.2006, 11:56
Помогите с курсовой. Ассем. не знаю.

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

Если можно, очень прошу пишите с комментами.

Автор: MAKCim 19.10.2006, 14:57
Цитата

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

Код

.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

Автор: NEt_Hunter 20.10.2006, 19:00
Большое спасибо, Макс! Но я не пойму где эти три константы smile 

Автор: NEt_Hunter 26.10.2006, 17:39
Никто не поможет с комментами к командам?  smile 

Автор: anwe 28.10.2006, 17:00
Начнем с теории.
Ну, если ты занимаешься программированием, значит знаешь, что все данные (переменные, константы) содержаться в двоичном виде. С байтом проблем нет. Он как есть так и представлен.
Если данные размером в слово заносятся в память, то они туда заносятся и держатся в "перевернутом" виде. Представь два байта. Мы, люди, будем их нумеровать 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-файл здесь

Автор: MAKCim 28.10.2006, 17:13
Цитата

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

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

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

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

Автор: anwe 28.10.2006, 19:20
Цитата
Насколько я вижу - тут com-программа, а не exe
 Правильно, тут и приведен com-файл.
А на счет
Цитата
На каждой платформк по-разному
Это я знаю, но тогда задание вообще - не задание. Я понял так, что именно на это и делался упор.

Автор: NEt_Hunter 31.10.2006, 07:54
Спасибо огромное!!! Теперь каждую строчку понял, но есть еще кое-что для полной завершении проги:
Нужно результат добавить в файл.  smile 

Автор: anwe 31.10.2006, 14:32
Драсти, о чё сразу не сказал?
Правильно ли я понял, что надо создать файл и записать представление эти констант туда?

Автор: NEt_Hunter 31.10.2006, 15:08
Я думаю главное нужно было написать алгоритм проги, а результат оставил на потом. Там много нужно менять? smile 

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

Автор: NEt_Hunter 1.11.2006, 21:21
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 

Автор: anwe 2.11.2006, 01:26
Да все верно, почти.
Код

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

Автор: NEt_Hunter 2.11.2006, 15:01
а bufer где объявлять?

Автор: anwe 2.11.2006, 20:29
Как где, в конце:
Код

bufer       db   10h dup(?)
 что означает буфер размером в 10h байт неопределенных (пока не занесешь туда что-нибудь) данных.

Автор: NEt_Hunter 6.11.2006, 13:14
как я понял, создаю отдельный файл с этим кодом? smile 

Код

File DB ‘D:1.pas’,0
bufer       db   10h dup(?)
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


 ! 
alexeis1
Модератор: а код будет кто выделять?

Автор: anwe 6.11.2006, 15:02
Да

Автор: NEt_Hunter 7.11.2006, 07:17
Всем спасибо!!!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)