Рассылка закрыта
При закрытии подписчики были переданы в рассылку "RFpro.ru: Ассемблер? Это просто! Учимся программировать" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
Ассемблер? Это просто! Учимся программировать (FAQ)
Ассемблер? Это просто! Учимся программировать (FAQ)
Выпуск N 063 |
Вопросы, которые поступили от подписчиков рассылки
"Ассемблер? Это просто! Учимся программировать"
Дата выхода: 2001-08-17
Вопрос №534
Моя прога xor-ит строкку и обратно.
Как это делать правильно???(я имею в виду кодировать/декодировать)
1)Как можно мою прогу оптимизировать?
Я имею в виду что-то типа применения slos lods
xchg и т.п.
2) может надо вместо
mov al,string[di] - mov al,offst string[di] ????
3)может быть lea[si] и увеличивать потом si
вместо mov al,offset string[di]
прога прилагается
Ответ
Здравствуйте, Дмитрий!
Да все у тебя нормально (в смысле использования xor). Оптимизацию я написал.
Приложение:
Отправил эксперт: Василий
Эксперт отправил ответов (всего): 24
Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS
Вопрос №531
Рассылочка - класс! В смысле,нужная очень....
Так, как я новенький, сильно меня не пинайте, тем более, что первый вопрос почти полностью по Turbo Pascal 7.0
Смысел таков:
Uses Crt;
Begin
end.
Этот код на пентюхах, почему-то выдает Division by zero!!!
В режиме эмуляции DOS - тоже. TP 5.5 работает отлично.
Обращаюсь к ассемблерщикам потому, что есть далекая инфа, что проблема устраняется засылкой всего двух байт куда-то в глубину Crt. Может кто знает?
P.S. По поводу - заменить Crt на WinCrt, TP 7.0 на BorlandP 7.0, и вообще "Сиди себе на 5.5 и не вякай" - это мы в курсе... Дело в принципе!!!! Спысибо!
Ответ
Здравствуйте, Вал.Ик.!
Вышли exe-шник. Помогу.
Отправил эксперт: Василий
Эксперт отправил ответов (всего): 25
Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS
Вопрос №536
Здравствуйте Уважаемые Эксперты!
Прошу помочь освоить команды SUB и SBB. С вычитанием меньшего числа из большего никаких проблем нет, а вот вычитание большего числа из меньшего никак не могу освоить. В доступной мне литературе содержится лишь краткое описание данных команд без единого примера. А ситуация такая:
mov ax,60h ;96
mov bx,0F0h ;240
sub ax,bx ;или SBB
должно получится -144 или FFFFFF70h
в AX возвращается FF70h а куда пропадает FFFF ? И как контролировать флаг переноса ? Не помешали бы простенькие исходнички, можно без комментариев, разберусь.
Заранее спасибо, с уважением
Дмитрий
Ответ
Здравствуйте, Диман!
Всё правильно, т.к. при вычитании результат помещается в AX, а в AX
максимальное число 0FFFFh, то отрицательное число будет урезано.
Если будешь использовать EAX, то результат будет FFFFFF70h, если пару EDX:EAX, то - FFFFFFFFFFFFFF70h и так до бесконечности!
Чтобы результат был нормальный используй команду NEG, она меняет знак на противоположный, тогда после
mov ax,60h ;96
mov bx,0F0h ;240
sub ax,bx ;или SBB
neg ax
в AX будет 90H(или 144), только если собираешься использовать это число при дальнейших операциях, то создай переменную, которая будет хранить знак или проверяй флаг ZF(устанавливается в 1, если результат предыдущей операции отрицательный).
Отправил эксперт: Orlando
Эксперт отправил ответов (всего): 14
Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS
Вопрос №536
Здравствуйте Уважаемые Эксперты!
Прошу помочь освоить команды SUB и SBB. С вычитанием меньшего числа из большего никаких проблем нет, а вот вычитание большего числа из меньшего никак не могу освоить. В доступной мне литературе содержится лишь краткое описание данных команд без единого примера. А ситуация такая:
mov ax,60h ;96
mov bx,0F0h ;240
sub ax,bx ;или SBB
должно получится -144 или FFFFFF70h
в AX возвращается FF70h а куда пропадает FFFF ? И как контролировать флаг переноса ? Не помешали бы простенькие исходнички, можно без комментариев, разберусь.
Заранее спасибо, с уважением
Дмитрий
Ответ
Здравствуйте, Диман!
А с чего у тебя получится FFFFFF70h, когда ты работаешь с 16-разрядными регистрами типа ax, bx. А так, смотри приложение, может поможет.
Приложение:
Отправил эксперт: Василий
Эксперт отправил ответов (всего): 27
Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS
Вопрос №498
гДПЮБЯРБСИРЕ, СБЮФЮЕЛШЕ ЩЙЯОЕПРШ.
мЕДЮБМН ОПХНАПЕК ФЕЯРЙХИ ДХЯЙ(IBM IC35L060AVER07-0) Х ЙНМРПНККЕП(CMD PCI-0649 Ultra DMA IDE Controller) Й МЕЛС.
1. бЯё БПНДЕ АШ ПЮАНРЮЕР УНПНЬН, АШЯРПН Х РХУН :), МН ЕЯРЭ НДМЮ ГЮЦБНГДЙЮ, Р.Й. ЩРН БРНПНИ ДХЯЙ Х ОНДЙКЧВЕМ НМ ВЕПЕГ ЬКЕИТ ЙНМРПНККЕПЮ, Ю МЕ МЮОПЪЛСЧ, РН ОПХ НАПЮЫЕМХХ Й ЩРНЛС ДХЯЙС КЮЛОНВЙЮ МЮ ЯХЯРЕЛМНЛ АКНЙЕ МЕ ЛХЦЮЕР... ЛНФМН КХ ЙЮЙ-МХАСДЭ ЩРН ХЯОПЮБХРЭ ХКХ ЩРН РЮЙ Х ДНКФМН АШРЭ ?
2. б АХНЯНБЯЙНЛ ЯЕРЮОЕ ОПНДЮЙЮК МЮ БЯЕ БНОПНЯШ Б ПЮГДЕКЕ "IDE HDD AUTO DETECTION" ДКЪ НАНХУ БХМРНБ, МН ОПХ ЯРЮПРЕ ЯХЯРЕЛШ БЯё ПЮБМН БМЮВЮКЕ ЙНМРПНККЕП ХЫЕР ЩРНР ЯЮЛШИ БХМР, МЕКЭГЪ КХ ЕЦН ЙЮЙ-МХАСДЭ ОН ДЕТНКРС ОПНОХЯЮРЭ, ВРНАШ НМ ЕЦН МЕ ХЯЙЮК, Ю ГМЮК ВРН НМ ЕЯРЭ РЮЙНИ :) ?
3. оЕПБШИ ДХЯЙ МЕ ЯРЮК ОНДЙКЧВЮРЭ Й ЙНМРПНККЕПС, Р.Й. НМ ОНДДЕПФХБЮЕР РНКЭЙН юрю/33, Ю ЙНМРПНККЕП Х IBM'НБЯЙХИ ДХЯЙ юрю/100. ЙЮФЕРЯЪ ЦДЕ-РН ВХРЮК, ВРН ЕЯКХ МЮ НДХМ ЬКЕИТ ЙНМРПНККЕПЮ ОНДЖЕОХРЭ БХМРШ Я ПЮГМШЛХ юрю, РН БЯё АСДЕР ПЮАНРЮРЭ МЮ ЯЙНПНЯРХ ЛЕМЭЬЕЦН, РН АХЬЭ БХМР Я ОНДДЕПФЙНИ юрю/100 АСДЕР РНКЭЙН МЮ юрю/33. ЛНФЕР ЩРН БПЮЙХ БЯё ? :)
ЕЯКХ ДЮ, РН ЯРНХР КХ МЮ НДХМ ЬКЕИ ЙНМРПНККЕПЮ ЯПЮГС ДБЮ БХМРЮ БЕЬЮРЭ ? :) Х ЙЮЙНИ ХГ МХУ ДНКФЕМ АШРЭ АКХФЕ Й ЯЮЛНЛС ЙНМРПНККЕПС, ВРНАШ АШЯРПЕЕ БЯё ПЮАНРЮКН(ХЛЕЕРЯЪ ББХДС, ВРН НР ЙНМРПНККЕПЮ НРУНДХР НДХМ ЬКЕИТ Я ДБСЛЪ ПЮГЗЕЛЮЛХ) ? :)
ГШ: ОНД ЯКНБНЛ ЬКЕИТ ХЛЕЕРЯЪ ББХДС РЮЙНИ ОПНБНДНЙ ХКХ ЙЮЙ РЮЛ ЕЦН(80-wires/40-pin IDE cable), БННАЫЕЛ Ъ РНВМН МЕ ОНЛМЧ, МЮОХЯЮК РН, ВРН ОЕПБНЕ Б ЦНКНБС ОПХЬКН ;).
я СБЮФЕМХЕЛ, дЛХРПХИ.
Ответ
гДПЮБЯРБСИРЕ, дЛХРПХИ!
вРНАШ АХНЯЭ МЕ ДЕРЕЙРХК БХМРШ ГЮМНБН МЮДН Б ЯЮЛНИ ОЕПБНИ ЛЕМЧ АХНЯЮ ХКХ ЕЫё Б ЙЮЙНИ, ЕЯКХ С РЕАЪ МЕ ЮБЮПД ХКХ ТЕМХЙЯ СЙЮГЮРЭ БЛЕЯРН ЮБРН user ХКХ ЙЮЙ Б МЕЙНРНПШУ manual
Отправил эксперт: Alex2000
Эксперт отправил ответов (всего): 34
Экспертная группа: лНДЕКХ, БХДШ Х РХОШ ЙНЛОЭЧРЕПНБ (hard)
Вопрос №536
Здравствуйте Уважаемые Эксперты!
Прошу помочь освоить команды SUB и SBB. С вычитанием меньшего числа из большего никаких проблем нет, а вот вычитание большего числа из меньшего никак не могу освоить. В доступной мне литературе содержится лишь краткое описание данных команд без единого примера. А ситуация такая:
mov ax,60h ;96
mov bx,0F0h ;240
sub ax,bx ;или SBB
должно получится -144 или FFFFFF70h
в AX возвращается FF70h а куда пропадает FFFF ? И как контролировать флаг переноса ? Не помешали бы простенькие исходнички, можно без комментариев, разберусь.
Заранее спасибо, с уважением
Дмитрий
Ответ
Здравствуйте, Диман!
Или я что-то не понимаю, или кто-то другой! :)
Регистр ax - 16-битный, т.е. содержит 4 тетрады (что тоже самое, что 4 шестнадцатеричные цифры). Поэтому число -144 в этом случае будет равно именно ff70 (больше просто не влезет).
А если б ты писал вот так:
mov eax, 60h
mov ebx, 0f0h
sub eax, ebx
то в регистре eax получил бы именно ffffff70.
Отправил эксперт: Ayl
Эксперт отправил ответов (всего): 1
Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS
Вопрос №525
Здравствуйте!
У меня усть вопросики :)
1) Где можно найти tasm32.exe, tlink32.exe & import32.lib
2) Сейчас я пользуюсь Масмом, но у меня есть проблемка с созданием экзешника вот, то что я делаю.....
файл Digger.asm:
includelib c:\masm\lib\kernel32.lib
extrn _imp_ExitProcess@4:dword
ExitProcess equ _imp_ExitProcess@4
.386
.model flat,stdcall
option casemap:none
.data
;Инициализированные данные
.data?
;Неинициализированные данные
.code
start: ;Точка входа
push 0
call ExitProcess ;Выход из программы
end start
----------------
А потом я запускаю...
masm /Ic:\masm digger.asm
link digger.obj,digger.exe
----------------
Выводиться сообщение об шибке...
Microsoft (R) Segmented Executable Linker Version 5.31.009 Jul 13 1992
Copyright (C) Microsoft Corp 1984-1992. All rights reserved.
List File [nul.map]:
Libraries [.lib]:
Definitions File [nul.def]:
LINK : warning L4021: no stack segment
digger.obj(digger.asm) : error L2029: '_IMP_EXITPROCESS@4' : unresolved external
There was 1 error detected
----------------------
Может я неправильно создал kernal32.lib????
НО kernal32.lib от Visual C++ не подошёл!!!!
ии я сделал
implib.exe kernal32.lib kernal32.dll
(предварительно скопировав dll в ту директорию где запускал implib :)
Помогите!!!
Ответ
Здравствуйте, Dmitriy!
Пиши МНЕ
(opelya@pop.redcom.ru) -
пришлю!
Отправил эксперт: Evgos (http://ospelnikov.narod.ru - Личная страничка)
Эксперт отправил ответов (всего): 28
Экспертная группа: Работа с MASM/TASM
Вопрос №535
Моя прога xor-ит строкку и обратно.
Как это делать правильно???(я имею в виду кодировать/декодировать)
1)Как можно мою прогу оптимизировать?
Я имею в виду что-то типа применения slos lods
xchg и т.п.
2) может надо вместо
mov al,string[di] - mov al,offst string[di] ????
3)может быть lea[si] и увеличивать потом si
вместо mov al,offset string[di]
прога прилагается
Ответ
Здравствуйте, Дмитрий!
Комментировать Ваш текст не буду, в принципе все по делу сказали эксперты Broken Sword и Orlando.
Замечу только, что конструкция:
lea dx, string
в данном случае полностью аналогична
mov dx, offset string.
Еще замечание по ожиданию нажатия клавиши - все равно возвращаемое значение нас не интересует, так зачем вызывать функцию 10h? Во-первых, для подготовки данных для нее мы теряем и время, и размер кода (xor ax, ax и быстрее и короче, чем mov ax, 10h). Во-вторых, функция 10h не везде работает :)
P.S. 2Broken Sword. У меня получилось на 1 байт меньше, причем 4 байта ушли на 16-е прерывание :)
Приложение:
Отправил эксперт: Ayl
Эксперт отправил ответов (всего): 2
Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS
Вопрос №538
Как быстрей и лучше вывести 1 символ:
1)0eh,0ah,10h int10h
2)02h int 21h
Ответ
Здравствуйте, Дмитрий!
Помоему int 10h по определению быстрее чем int 21h
Мне кажется что большинство функций int 21h работают через int 10h.
Отправил эксперт: Dron (http://spawnhole.narod.ru/asmos/asmos.html - Операционная система с нуля!)
Эксперт отправил ответов (всего): 57
Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS
Вопрос №538
Как быстрей и лучше вывести 1 символ:
1)0eh,0ah,10h int10h
2)02h int 21h
Ответ
Здравствуйте, Дмитрий!
Через BIOS! А ещё лучше - через видеопамять.
Вот цепочка вызовов:
INT 21h --> INT 10h --> Запись в видеопамять.
Т.е. DOS всё-равно вызывает BIOS, причём тратит время на поиск
во внутренних структурах драйвера 'CON' и его вызова, в то
время как мы можем вызвать BIOS напрямую. Однако, если заранее
известно разрешение экрана, гораздо удобнее использовать запись
в видеопамять, так как BIOS умножает текущую координату курсора
Y на ширину экрана (а команда MUL - не из самых быстрых :( ),
затем добавляет туда X и заодно ещё умножает это дело на 2 (так
как в видеопамяти один символ представлен двумя байтами).
Отправил эксперт: Nik
Эксперт отправил ответов (всего): 71
Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS
Вопрос №539
Как быстрей и лучше вывести 1 символ:
1)0eh,0ah,10h int10h
2)02h int 21h
Ответ
Здравствуйте, Дмитрий!
Вообще, насколько я знаю с биос побыстрей работа идет, да и функции для этого унеё поудобней, но если скорость нужна просто скопируй напрямик в видеопамять!
Но в любом случае разница в скорости будет очень мала.
Отправил эксперт: Orlando
Эксперт отправил ответов (всего): 15
Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS
Вопрос №539
Как быстрей и лучше вывести 1 символ:
1)0eh,0ah,10h int10h
2)02h int 21h
Ответ
Здравствуйте, Дмитрий!
Через:
push 0B800h
pop es
mov es:[2000], symbol
Отправил эксперт: Василий
Эксперт отправил ответов (всего): 28
Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS
Вопрос №539
Как быстрей и лучше вывести 1 символ:
1)0eh,0ah,10h int10h
2)02h int 21h
Ответ
Здравствуйте, Дмитрий!
0E-выводит 1 символ, сдвигает курсор и экран, если надо, обрабатывает CR, LF, BEL(т.е. 13h, 10h, 7h)
0A-выводит CX символов подряд, причем курсор не модифицируется, медленно
09-выводит CX символов с атрибутами подряд, причем курсор не модифицируется, медленно
02 int 21h выводит в стандартный вывод(СВ), обрабатывает еще и BackSpace
Разница между экраном и СВ такова, что СВ можно переопределить в файл Досом типа test.exe > out.txt
А самым быстрым методом будет писать прямо в видеопамять!
Отправил эксперт: Sensey
Эксперт отправил ответов (всего): 81
Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS
Вопрос №538
Как быстрей и лучше вывести 1 символ:
1)0eh,0ah,10h int10h
2)02h int 21h
Ответ
Здравствуйте, Дмитрий!
Быстрее
3) al=Код символа
int 29h
Отправил эксперт: Broken Sword (www.revolution.co.uk - скрытая реклама...)
Эксперт отправил ответов (всего): 58
Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS
Вопрос №540
Broken Sword
Ответ
Уважаемый Broken Sword! ;)
Уважаемый эксперт Orlando! В ответе на вопрос 536 (команды sub и sbb) вы допустили роковую ;) ошибку! Флаг ZF НИКАК не зависит от знака числа, вы его вероятно спутали с CF...
Уважаемый эксперт Ayl! ;) Можете убирать теперь "4 лишних байта" ;). Ваш вариант - 61, мой новый - 52 (без очистки экрана 47...). Попробуйте теперь сделать меньше! Уважаемые эксперты, на самом деле ТО ЧЕМ МЫ ТУТ ЗАНИМАЕМСЯ ИСКЛЮЧИТЕЛЬНО ПОЛЕЗНО ДЛЯ МОЗГОВ!!! Прошу присоединяться! ;)
.model tiny
.code
org 100h
@@Start:
mov ax,3
int 10h
call printing
call recode
call recode
ret
printing proc near
mov ah,09h
mov dx,offset string
int 21h
ret
endp
recode proc near
mov cx,string_len
xor si,si
@@1: xor string[si],0Fh
inc si
loop @@1
call printing
ret
endp
string db 'daylight',0Ah,0Dh,24h
string_len equ $-string-3
end @@Start
Отправил эксперт: Broken Sword (www.revolution.co.uk - УЛТЩФБС ТЕЛМБНБ...)
Эксперт отправил ответов (всего): 59
Экспертная группа: пВЭЙЕ ЧПРТПУЩ РП РТПЗТБННЙТПЧБОЙА ОБ бУУЕНВМЕТЕ РПД DOS
Подписаться на рассылки
Форма подачи вопроса
ВНИМАНИЕ!!! Пожалуйста, НЕ высылайте один вопрос сразу нескольким подгруппам! Дополнения к вопросам, на которые эксперт уже ответил НЕ следует направлять ведущему рассылки (я не успеваю!). Просто скомбинируйте первый вопрос и дополнение к нему, а затем заново отправьте его, используя приведенную ниже форму!Нажимайте кнопку "Отправить" только ОДИН раз и дождитесь полной загрузки страницы, иначе вопрос будет продублирован!
Регистрация в качестве эксперта
Архив выпусков
Ведущий рассылки,
Калашников Олег:
Assembler@Kalashnikoff.ru
ICQ No.: 68951340
URL сайта подписчиков:
http://www.Kalashnikoff.ru
______________
По вопросам сотрудничества, рекламы и спонсорства обращайтесь:
- Публичное размещение материала из рассылки: Cooperation@Kalashnikoff.ru
- Реклама на сайте, в книге и рассылках: http://www.Kalashnikoff.ru/Reklama.html, Reklama@Kalashnikoff.ru
- Издание книги (спонсорство): Sponsor@Kalashnikoff.ru
(C) Москва, 2001. Авторское право принадлежит Калашникову О.А. Публичное размещение материала из рассылки, а также его использование полностью или частично в коммерческих или иных подобных целях без письменного согласия автора влечет ответственность за нарушение авторских прав. |
Реклама на сайте Kalashnikoff.ru
http://subscribe.ru/
E-mail: ask@subscribe.ru | Отписаться | Рейтингуется SpyLog |
В избранное | ||