Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Ассемблер? Это просто! Учимся программировать (FAQ)


Служба Рассылок Subscribe.Ru проекта Citycat.Ru

Ассемблер? Это просто! Учимся программировать (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

Подписаться на рассылки

Рассылки Subscribe.Ru
Ассемблер? Это просто! Учимся программировать
Ассемблер? Это просто! Учимся программировать (FAQ)

Форма подачи вопроса

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

Нажимайте кнопку "Отправить" только ОДИН раз и дождитесь полной загрузки страницы, иначе вопрос будет продублирован!


Ваше имя *:

Ваш e-mail *:

Подгруппы:

Вопрос *:

Прилагаемая программа (если необходимо):


Регистрация в качестве эксперта

Архив выпусков


Ведущий рассылки,

Калашников Олег: Assembler@Kalashnikoff.ru
ICQ No.:
68951340
URL сайта подписчиков: http://www.Kalashnikoff.ru

______________

По вопросам сотрудничества, рекламы и спонсорства обращайтесь:

  1. Публичное размещение материала из рассылки: Cooperation@Kalashnikoff.ru
  2. Реклама на сайте, в книге и рассылках: http://www.Kalashnikoff.ru/Reklama.html, Reklama@Kalashnikoff.ru
  3. Издание книги (спонсорство): Sponsor@Kalashnikoff.ru

Рассылка 'Ассемблер? Это просто! Учимся программировать (FAQ)' Рассылка 'Ассемблер? Это просто! Учимся программировать'


(C) Москва, 2001. Авторское право принадлежит Калашникову О.А. Публичное размещение материала из рассылки, а также его использование полностью или частично в коммерческих или иных подобных целях без письменного согласия автора влечет ответственность за нарушение авторских прав.


http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться Рейтингуется SpyLog

В избранное