L.A.W. ТурбоДебагером пробвал (взял его от старой Борланд Си) .... он вылитает с ошибкой... вернее его закрывает Виста... вот я не могу понять дело в Висте или вчем еще. Обычный дебагом не пробывал
В висте ваще не должны работать ДОСовские программы. Это не очень хорошая идея пробовать так. Создай или виртуальную машину или загрузочный диск ДОС. И уже с ним эксперементируй.
_________________ I L.A.W. you, baby!
For a GNU dawn! For freedom!
L.A.W. Кажется разобрался.... Дело не в Висте, я сам накосячил в проге, сейчас переделал и все отлично работает.
Остается только один вопрос, важный для меня, алгоритм работы str2bin/bin2str?
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
Я их использую, несовсем понимая смысл как они работают... (делал свою прогу по образцу) и теперь на защите проге будут вопросы по коммандам и АЛГОРИТМЕ работе этих функций(коментариев мало) Вот еще один вопрос: надо заменить
Хм... Раньше про них не слышал...
Разбираться в том, как они работают сейчас некогда.
Но общий принцип у них простой.
Число в строку:
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!
Извините что немного не в тему, но мне срочно нужно решить несколько небольших заданий на ассемблере:( Заранее спасибо !
Здравствуйте уважаемые форумчане, помогите мне пожалуйста в решение небольших заданий. Заранее спасибо !
Тема 1. Вычисление значения выражения
Реализовать вычисление заданного выражения как ассемблерную вставку в программе на языке Паскаль.
Программа на Паскале должна запрашивать значения переменных и выводить результат на экран.
Все переменные являются целочисленными.
(A * X + B) div ((C * X + D) div E)
Тема 2. Битовые операции. Упакованные данные
Программы реализуются как ассемблерные вставки в Паскаль.
Реализовать с помощью логических операций вставку заданного значения (0 или 1) в любой бита байта с потерей исходного значения.
Тема 3. Структуры. Записи
Программа должна быть реализована на языке ассемблера TASM.
Под записью подразумевается структура с упакованными данными.
Реализовать базу данных с полями «Фамилия», «Имя», «Отчество», «Пол», «Год рождения». Каждая запись должна представлять собой структуру с соответствующими полями. Интерфейс должен позволять:
1)Вносить новые записи
2)Удалять записи
3)Поиск записей по возрасту
4)Изменение возраста у найденных записей.
Тема 4. Процедуры
Реализовать подпрограмму, которая заменяет все заглавные буквы данной строки на строчные и наоборот.
Тема 5. Модульное программирование
В модуле команды должны быть реализованы в виде макросов.
Реализовать модуль, содержащий два макроса выделения целой и дробной части рационального числа.
Member
Статус: Не в сети Регистрация: 21.02.2006 Откуда: Омск
Sinhronize, ужасно знакомые задачи... Это ведь Белим, вроде как.... А значит ты с ФКН, наверное )
Если еще не сдал обратись - у меня половина всех вариантов есть написанные, а так пиши лучше сам
Помогите, пожалуйста, с материалом(статьи, исходники) для написания программы измерения параметров ОЗУ (чтение, запись, пеесылка
Какие именно параметры ты собрался менять?
Для процов 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
Статус: Не в сети Регистрация: 12.07.2005 Откуда: Млечный путь
нужно написать процедуру складывающую два числа без использования add. Можно использовать команды цикла и команды инкремента/декремента. Параметры передаются через регистры. Помогите, пожалуйста. Добавлено спустя 18 минут, 6 секунд ?Am(d)ber? тхаха, блин, че-то я ступил! Ж-) это же проще простого
_________________ В этом мире меня подводят доброта и порядочность...
Junior
Статус: Не в сети Регистрация: 06.08.2005 Откуда: Израиль
Народ помогите! Начал учить Ассемблер и есть вопрос: Требуется вывести строку на экран так чтоб она ещё и двигалась как бегущая строка. Объясните как организовать движение (думаю что шифтингом битов + петля) и если можно пример кода! Спасибо!
_________________ Правишь файл righthands.sys и все работает!
где он этот righthands.sys?.... NO MORE COMMENTS....
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 28
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения