Часовой пояс: UTC + 3 часа




Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 641 • Страница 21 из 33<  1 ... 18  19  20  21  22  23  24 ... 33  >
  Пред. тема | След. тема 
В случае проблем с отображением форума, отключите блокировщик рекламы
Автор Сообщение
 

Member
Статус: Не в сети
Регистрация: 13.08.2005
Night.Elf.88 писал(а):
L.A.W. ТурбоДебагером пробвал (взял его от старой Борланд Си) .... он вылитает с ошибкой... вернее его закрывает Виста... вот я не могу понять дело в Висте или вчем еще. Обычный дебагом не пробывал

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

_________________
I L.A.W. you, baby!
For a GNU dawn! For freedom! :-)



Партнер
 

Advanced member
Статус: Не в сети
Регистрация: 30.08.2003
Откуда: Санкт-Петербург
Цитата:
Создай или виртуальную машину или загрузочный диск ДОС

вариант - DOSbox.

_________________
{:€ дед в законе :-) нородный окодемег
почетный пользователь OpenSuSE 11.3
Ремонт и модернизация ноутбуков IBM (Lenovo) ThinkPad


 

Member
Статус: Не в сети
Регистрация: 28.08.2006
L.A.W. Кажется разобрался.... Дело не в Висте, я сам накосячил в проге, сейчас переделал и все отлично работает.
Остается только один вопрос, важный для меня, алгоритм работы str2bin/bin2str?


 

Member
Статус: Не в сети
Регистрация: 13.08.2005
Night.Elf.88 писал(а):
Остается только один вопрос, важный для меня, алгоритм работы str2bin/bin2str?

Чего? :-)

_________________
I L.A.W. you, baby!
For a GNU dawn! For freedom! :-)


 

Member
Статус: Не в сети
Регистрация: 28.08.2006
L.A.W. Есть две стандартные функции...
Приведу их полностью
вот первая bin2str
Код:
; Процедура преобразования двоичного числа в строку символов
; Bход - AX - число
; Bыход - строка по адресу DS:BX
bin2str   proc
            push   dx
            push   cx
            push   bx
            push   si
            push   ax
            mov    cx,6
fill_buff:  mov    byte ptr[bx+1],'' ; Заполнить строку пробелами
            inc    bx
            loop   fill_buff
            mov    si,10        ; |SI|:=10
            or     ax,ax        ; В |AX| - отрицательное число
            jns    clr_div      ; Если +, переход на clr_div
            neg    ax           ; Иначе, меняем знак
clr_div:    sub    dx,dx        ; очистить старшую половину делимого
            div    si           ; |DX:AX| / 10
            add    dx,'0'       ; Преобразовать в символьный вид
            dec    bx           ; |BX|--
            mov    [bx+1],dl    ; Запомнить очередн. цифру в строке
            or     ax,ax        ; В регистре ax - 0?
            jnz    clr_div      ; Если не 0, повторить
            pop    ax           ;
            or     ax,ax        ; Исходное число отрицательно ?
            jns    no_more      ; Если нет, переход к no_more
            dec    bx           ; |BX|--
            mov    byte ptr[bx+1],'-'  ; Поместить в строку знак '-'
no_more:    pop    si
            pop    bx
            mov    byte ptr[bx],6      ; Поместить счетчик символов
            pop    cx
            pop    dx
            ret
bin2str     endp

вот вторая str2bin


Код:
; Процедура преобразования строки символов в двоичное число
; Bход - DS:BX - адрес строки
; Bыход - AX - число со знаком
str2bin   proc
            push   bx
            push   cx
            sub    AX,AX
            sub    ch,ch
            mov    cl,byte ptr[bx]   ; Счетчик символов - в CX
blanks:     cmp    byte ptr[bx+1],'' ; Цикл пропуска пробелов
            jne    chk_neg
            inc    bx
            loop   blanks
            jmp    good              ; Не обнаружено чисел. результат - 0
; Следующие команды выполняются в случае знака "-"
chk_neg:    cmp    byte ptr[bx+1],'-'
            jne    chk_pos
            inc    bx                ; Продвинуть указатель
            dec    cx                ; Уменьшить счетчик
            call   conv_ab           ; Вызвать программу преобразования
            jc     thru
            cmp    AX,32768          ; Число < -32768
            ja     no_good           ; Да, ошибка
            neg    AX                ; Изменить знак числа
            js     good              ; OK, выходим
; Следующие команды выполняются в случае, если знак не минус
chk_pos:    cmp    byte ptr[bx+1],'+'; sign '+'?
            jne    go_conv   ; Нет, идти на преобразование
            inc    bx        ; Сместить указатель в строке
            dec    cx        ; Уменьшить счетчик символов
go_conv:    call   conv_ab   ; Преобразовать строку в число
            jc     thru      ; В случае ошибки - на выход
            cmp    AX,32767  ; Число не слишком велико?
            ja     no_good   ; Слишком велико, ошибка
good:       clc              ; Очистить флаг CY
            jnc    thru
no_good:    stc              ; Set carry flag
thru:       pop    cx        ; Восстановить значения регистров
            pop    bx
            jmp    skipit
;
; Процедура собственно преобразования числа
conv_ab   proc
            push   bp
            push   bx
            push   si
            mov    bp,bx  ; Поместить указатель на строку в BX
            xor    bx,bx  ; Очистить BX
range:      cmp    byte ptr ds:[bp+1],'0' ; Символ - цифра ?
            jb     non_dig                ; Нет не цифра
            cmp    byte ptr ds:[bp+1],'9' ; Символ > '9'
            jbe    digit                  ; Символ - цифра
non_dig:    stc                     ; Установить флаг ошибки
            jc     end_conv         ; И выйти из процедуры
digit:      mov    si,10
            push   dx            ; Сохранить DX
            mul    si            ; |Ax| * |SI| -> |DX:AX|
            pop    dx            ; Восстановить DX
            mov    bl,ds:[bp+1]  ; Взять очередной символ из строки
            and    bx,0fh        ; Преобразовать символ в двоичное
            add    AX,bx         ; Добавить цифру к старому результату
            jc     end_conv      ; Если результат слишком велик, то выйти
            inc    bp            ; Адрес след цифры в строке
            loop   range         ; Замкнуть цикл по количеству символов
            clc                  ; Сбросить флаг переноса (нет ошибки)
end_conv:   pop    si            ; Восстановить регистры и выйти
            pop    bx
            pop    bp
            ret
conv_ab     endp
skipit:     ret
str2bin     endp

Я их использую, несовсем понимая смысл как они работают... (делал свою прогу по образцу) и теперь на защите проге будут вопросы по коммандам и АЛГОРИТМЕ работе этих функций(коментариев мало) :(
Вот еще один вопрос: надо заменить
Код:
mov [bx][si],ax
add si,2 
на одну команду "LODS"


 

Member
Статус: Не в сети
Регистрация: 13.08.2005
Night.Elf.88 писал(а):
L.A.W. Есть две стандартные функции.

Хм... Раньше про них не слышал...
Разбираться в том, как они работают сейчас некогда.
Но общий принцип у них простой.
Число в строку:
1) получаем остаток от деления числа на 10 (для десятичной системы)
2) к этому остатку прибаляем 30h (т.е. из числа получаем аски-код цифры)
3) этот аски код заносим в нашу строку
4) делим исходное число на 10 (целочисленно)
5) то что получили - новое исходное число. Если оно не 0 - идем к пункту 1. Если 0 - закончили.
6) поставили знак числа

Строку в число:
Расписывать не буду. Общая идея - берем очередную цифру из строки, переводим аски-код в число (- 30h), и, умножив на весовой кроэффициент позиции цифры, прибавляем это число к переменной, представляющей результат.

Можешь даже сам написать процедуры - проще будет.

_________________
I L.A.W. you, baby!
For a GNU dawn! For freedom! :-)


 

Member
Статус: Не в сети
Регистрация: 28.08.2006
L.A.W. ОГРОМНОЕ спасибо.... мне вот так и надобыло принцип разъеснить, теперь начил понимать....


 

Member
Статус: Не в сети
Регистрация: 13.08.2005
Night.Elf.88 Всегда пожалуйста.

_________________
I L.A.W. you, baby!
For a GNU dawn! For freedom! :-)


 

Member
Статус: Не в сети
Регистрация: 07.01.2007
Подскажите пожалуйста как вывести число из регистра на экран, понимаю вопрос детский но инфы не нашел.


 

Member
Статус: Не в сети
Регистрация: 13.08.2005
@ShaD@ писал(а):
Подскажите пожалуйста как вывести число из регистра на экран, понимаю вопрос детский но инфы не нашел.

2-я функция 21-го прерывания (для ДОС). В DL - код выводимого символа.

_________________
I L.A.W. you, baby!
For a GNU dawn! For freedom! :-)


 

Member
Статус: Не в сети
Регистрация: 07.01.2007
Спасибо.


 

Junior
Статус: Не в сети
Регистрация: 25.05.2007
Извините что немного не в тему, но мне срочно нужно решить несколько небольших заданий на ассемблере:( Заранее спасибо !
Здравствуйте уважаемые форумчане, помогите мне пожалуйста в решение небольших заданий. Заранее спасибо !

Тема 1. Вычисление значения выражения
Реализовать вычисление заданного выражения как ассемблерную вставку в программе на языке Паскаль.
Программа на Паскале должна запрашивать значения переменных и выводить результат на экран.
Все переменные являются целочисленными.
(A * X + B) div ((C * X + D) div E)

Тема 2. Битовые операции. Упакованные данные
Программы реализуются как ассемблерные вставки в Паскаль.
Реализовать с помощью логических операций вставку заданного значения (0 или 1) в любой бита байта с потерей исходного значения.

Тема 3. Структуры. Записи
Программа должна быть реализована на языке ассемблера TASM.
Под записью подразумевается структура с упакованными данными.
Реализовать базу данных с полями «Фамилия», «Имя», «Отчество», «Пол», «Год рождения». Каждая запись должна представлять собой структуру с соответствующими полями. Интерфейс должен позволять:
1)Вносить новые записи
2)Удалять записи
3)Поиск записей по возрасту
4)Изменение возраста у найденных записей.

Тема 4. Процедуры
Реализовать подпрограмму, которая заменяет все заглавные буквы данной строки на строчные и наоборот.

Тема 5. Модульное программирование
В модуле команды должны быть реализованы в виде макросов.
Реализовать модуль, содержащий два макроса выделения целой и дробной части рационального числа.


 

Member
Статус: Не в сети
Регистрация: 13.08.2005
Sinhronize Лучше ты сам попробуй. А будут непонятки - спрашивай.

_________________
I L.A.W. you, baby!
For a GNU dawn! For freedom! :-)


 

Member
Статус: Не в сети
Регистрация: 21.02.2006
Откуда: Омск
Sinhronize, ужасно знакомые задачи... Это ведь Белим, вроде как.... А значит ты с ФКН, наверное )
Если еще не сдал обратись - у меня половина всех вариантов есть написанные, а так пиши лучше сам


 

Member
Статус: Не в сети
Регистрация: 12.07.2005
Откуда: Млечный путь
Помогите, пожалуйста, с материалом(статьи, исходники) для написания программы измерения параметров ОЗУ (чтение, запись, пеесылка)

_________________
В этом мире меня подводят доброта и порядочность...


 

Member
Статус: Не в сети
Регистрация: 13.08.2005
?Am(d)ber? писал(а):
Помогите, пожалуйста, с материалом(статьи, исходники) для написания программы измерения параметров ОЗУ (чтение, запись, пеесылка

Какие именно параметры ты собрался менять?
Для процов AMD я думаю контроллером память мона управлять через MSR. А для Intel как-то не интересовался.
А что конкретно ты задумал?

_________________
I L.A.W. you, baby!
For a GNU dawn! For freedom! :-)


 

Member
Статус: Не в сети
Регистрация: 12.07.2005
Откуда: Млечный путь
L.A.W. писал(а):
Какие именно параметры ты собрался менять?
Для процов AMD я думаю контроллером память мона управлять через MSR. А для Intel как-то не интересовался.
А что конкретно ты задумал?

Мне нужно не менять, а измерять. Скорость чтения, записи, копирования ОЗУ.

_________________
В этом мире меня подводят доброта и порядочность...


 

Member
Статус: Не в сети
Регистрация: 13.08.2005
?Am(d)ber? писал(а):
Мне нужно не менять, а измерять.

Ааааа... Хм... Ну тады ой. Таких алгоритмов не знаю...

_________________
I L.A.W. you, baby!
For a GNU dawn! For freedom! :-)


 

Member
Статус: Не в сети
Регистрация: 12.07.2005
Откуда: Млечный путь
нужно написать процедуру складывающую два числа без использования add. Можно использовать команды цикла и команды инкремента/декремента. Параметры передаются через регистры. Помогите, пожалуйста.
Добавлено спустя 18 минут, 6 секунд
?Am(d)ber?
тхаха, блин, че-то я ступил! Ж-) это же проще простого :D

_________________
В этом мире меня подводят доброта и порядочность...


 

Junior
Статус: Не в сети
Регистрация: 06.08.2005
Откуда: Израиль
Народ помогите! Начал учить Ассемблер и есть вопрос: Требуется вывести строку на экран так чтоб она ещё и двигалась как бегущая строка. Объясните как организовать движение (думаю что шифтингом битов + петля) и если можно пример кода! Спасибо!

_________________
Правишь файл righthands.sys и все работает!
где он этот righthands.sys?.... NO MORE COMMENTS....


Показать сообщения за:  Поле сортировки  
Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 641 • Страница 21 из 33<  1 ... 18  19  20  21  22  23  24 ... 33  >
-

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 28


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB | Kolobok smiles © Aiwan