Рассылка закрыта
При закрытии подписчики были переданы в рассылку "RFpro.ru: Ассемблер? Это просто! Учимся программировать" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
RusFAQ.ru: программирование на языке Assembler
Информационный Канал Subscribe.Ru |
RusFAQ.ru: программирование на языке Assembler
Выпуск № 429
от 29.11.2002, 03:50
Администратор: Имя: Калашников О.А. URL: Информационный ресурс ICQ: 68951340 Россия, Москва |
О рассылке: Задано вопросов: 1980 Отправлено ответов: 6099 Активность: 308.0 %
|
Список экспертов, ответы которых опубликованы в данном выпуске |
Bob Johnson Статус: Профессиональный Общий рейтинг: 154.31 [Подробней >>] |
masquer Статус: Профессиональный Общий рейтинг: 151.41 [Подробней >>] |
Andrew Vext Статус: Доверительный Общий рейтинг: 108.67 [Подробней >>] |
Sensey Статус: Профессиональный Общий рейтинг: 122.7 URL: Страничка рассылки по Паскалю Телефон: +38 (0572) 41-76-04 дом. [Подробней >>] |
Maverick Статус: Профессиональный Общий рейтинг: 137.2 URL: Задачи по ассемблеру Телефон: 89039415024 (BiLine GSM) [Подробней >>] |
ASMодей Статус: Профессиональный Общий рейтинг: 119.46 [Подробней >>] |
Ayl Статус: Профессиональный Общий рейтинг: 117.32 [Подробней >>] |
Portnov Статус: Профессиональный Общий рейтинг: 116.46 URL: Мой сайтик... [Подробней >>] |
keleb-glin Статус: Доверительный Общий рейтинг: 115.06 [Подробней >>] |
Gibbel Статус: Профессиональный Общий рейтинг: 108.62 URL: Страничка обо мне и моих друзьях [Подробней >>] |
Краткий перечень вопросов |
Вопрос № 1920. В программе на СИ у меня двухмерный массив Array[a][b]. Из ассеблерной программы (отдельной) мне над... (ответов: 1)
Вопрос № 1921. Здравствуйте, эксперты! Не подскажите ли, где можно почитать на русском о CryptoAPI (MSDN просьба не... (ответов: 2)
Вопрос № 1922. И еще один вопрос по стыковке ВС5+Tasm: стыковал по доке к Tasm, но в конце концов при компиляции в ... (ответов: 2)
Вопрос № 1924. Ттут я вопрос посылал про аргументы коммандной строки. И все мне написали что в реале всё начинается... (ответов: 6)
Вопрос № 1925. Хотел бы повторить вопрос. В чем разница при ассемблировании 286....586. Будет ли изменятся размер п... (ответов: 7)
Вопрос № 1926. Уважаемый Maverick, а также другие эксперты. Скиньте (плиииз) исходники Юрова, о которых вы писали н... (ответов: 1)
Вопрос № 1927. Здравствуйте, ув. эксперты! 1. Почему, хотя стек начинается с 0FFFFh (так в рассылке по ассемблеру н... (ответов: 6)
Вопрос № 1928. В программе символы, полученные с клавиатуры, заносятся в переменную, а после нажатия Esc переменная... (ответов: 3)
Вопрос № 1929. Уважаемые эксперты, я по вопросу N 1910 (как разделить 32 бит число при помощи 16 бит регистров). Сп... (ответов: 2)
Вопросов: 9, ответов: 30
Вопрос № 1920 |
В программе на СИ у меня двухмерный массив Array[a][b]. Из ассеблерной программы (отдельной) мне надо получить сегмент и смещение Array[a].
Как это сделать. Tasm ругается при "les di" и при "mov ax,seg Array[a][0];mov es,ax; assume es:nothing([Constant] assumed to mean immediate constant)".
Вопрос отправлен: 24.11.2002, 06:19
Отправитель: Vladimir
[Следующий вопрос >>] [Список вопросов]
Отвечает Bob Johnson
Здравствуйте, Vladimir!
Можешь передавать ассемблеру просто указатель на нужную точку внутри массива, например в С++ если определить
int array[a][b]; то можно вызывать внешнюю ассемблерную функцию с параметром (*int) как func (array [a]), тогда ей просто будет передан адрес.
Ответ отправлен: 25.11.2002, 13:33
Отправитель: Bob Johnson
Вопрос № 1921 |
Здравствуйте, эксперты!
Не подскажите ли, где можно почитать на русском о CryptoAPI (MSDN просьба не предлагать) или небольшой (можно большой) пример с комментариями (можно без) как зашифровать/расшифровать тест, используя эи функции.
Заранее благодарен
EraSer
Вопрос отправлен: 24.11.2002, 09:40
Отправитель: EraSer (eraser99@tut.by)
[Следующий вопрос >>] [Список вопросов]
Отвечает masquer
Добрый день, EraSer!
На rsdn.ru было что-то
Ответ отправлен: 25.11.2002, 12:08
Отправитель: masquer
Отвечает Andrew Vext
Здравствуйте, EraSer!
1. Книга Си: архив программ с комментариями.
2. Журнал программист (www.programme.ru)
3. www.rusdoc.ru
ну и т.д.
Ответ отправлен: 25.11.2002, 14:42
Отправитель: Andrew Vext
Вопрос № 1922 |
И еще один вопрос по стыковке ВС5+Tasm: стыковал по доке к Tasm, но в конце концов при компиляции в ВС не видит функций, хотя про переменные молчит.
Из СИ я ссылаюсь на обработчик таймера (устанавливаю вектор) и на процедуру плюс две переменные.
Из ассемлера на несколько функций, но до них дело еще не дошло. Проставил как написано в СИ без, в Асм с "_" (а еще и так и сяк "_"), не помогает.
Пробовал скомпилировать через ВСС. Про эти функции промолчал, но придрался к файловым. Экзешник создал, но при прогонке через TD адреса ассемблерных функций по нолям.
Как вообще корректно все это сшивать и компилировать?
Да, естественно я объявил их PUBLIC.
Вопрос отправлен: 24.11.2002, 10:37
Отправитель: Vladimir
[Следующий вопрос >>] [Список вопросов]
Отвечает Sensey
Добрый день, Vladimir!
Extern в С коде писал?
Компилишь как С или как С++? Надо как С.
Ответ отправлен: 24.11.2002, 10:47
Отправитель: Sensey
Отвечает Bob Johnson
Добрый день, Vladimir!
Я делал так, чтобы BCB вызывал некоторые процедуры, написанные на асме, а асм, в свою очередь, считывал некоторые переменные основной программы. Вот как это оформлялось:
процедуры в асм:
Public @_название_
дальше
@_название_ proc
@_название_ endp
процедуры в С++:
extern "C" void __fastcall _название_ ();
переменные в С++:
int _имя_
переменные в асме:
EXTRN C _имя_ :DWORD
и все отлично работало.
Ответ отправлен: 25.11.2002, 13:34
Отправитель: Bob Johnson
Вопрос № 1924 |
Ттут я вопрос посылал про аргументы коммандной строки. И все мне написали что в реале всё начинается на 82h. Вот я не понимаю - лана вы правы, но хрен тада в дебаггере высвечивается по 81h, а по 80h - пробел... Почему в дебаггере начинается так? Я использовал рекомендованный тут avputil. и ещё td. Как тогда проги то отлаживать?
Приложение:
Вопрос отправлен: 24.11.2002, 13:37
Отправитель: Эдвард Самохвалов (zeleniy_kot@yahoo.com)
[Следующий вопрос >>] [Список вопросов]
Отвечает Maverick
Доброе время суток, Эдвард Самохвалов!
Дебаггеры еще регистры обнуляют, поэтому некоторые программы под ними работают, а без них нет :(, че творится то
Ответ отправлен: 24.11.2002, 14:55
Отправитель: Maverick
Отвечает ASMодей
Здравствуйте, Эдвард Самохвалов!
Поменяй дебаггер - у меня, например, TD все показывает так,
как есть на самом деле.
Ответ отправлен: 25.11.2002, 06:15
Отправитель: ASMодей
Отвечает Ayl
Доброе время суток, Эдвард Самохвалов!
Ну я не знаю, что у тебя за TD, у меня при вызове td и установки Run -> Arguments... -> 2002 картина такая:
cs=ds=es=ss=PSP
ds:80h = 05h
ds:81h = 20h = пробел
ds:82h = 32h = 2
ds:83h = 30h = 0
ds:84h = 30h = 0
ds:85h = 32h = 2
Ответ отправлен: 25.11.2002, 12:49
Отправитель: Ayl
Отвечает Portnov
Здравствуйте, Эдвард Самохвалов!
По 80h лежит длина командной строки; строго говоря, командная строка начинается с 81h, но обычно при вызове программы ключи командной строки отделяют от имени программы пробелом, поэтому по 81h обычно оказывается пробел - первый символ командной строки. Однако, ДОС понимает и слэш в качестве разделителя имени программы и ключей, т.е. прогу prog.com можно вызывать
prog.com /mykey,
а можно
prog.com/mykey,
и в обоих случаях произойдет запуск prog.com. Но во втором случае по 81h окажется слэш!
Учитывая все вышесказанное, можно рекомендовать просто игнорировать символ по 81h и считать, что командная строка начинается с 82h. Да, и еще лучше бы учесть такой момент: если перед ключами поставить два пробела, то и по 82h будет пробел, а если три - то и по 83h... Короче, при разборе командной строки для поиска первого ключа надо искать первый символ - не пробел, начиная с 81h.
С уважением, Portnov.
Ответ отправлен: 25.11.2002, 13:05
Отправитель: Portnov
Отвечает Bob Johnson
Здравствуйте, Эдвард Самохвалов!
Не знаю, чувак, ну курить ты бросай... Вот этот вот самый td и показывает по 80h длину, по 81h пробел, а по 82h и далее - сами параметры...
Ответ отправлен: 25.11.2002, 13:35
Отправитель: Bob Johnson
Отвечает keleb-glin
Здравствуйте, Эдвард Самохвалов!
Не знаю, что у тебя за проблемы. В дебаггере ( TD ) всё высвечивается как положено:
80h - количество байтов в строке ( считая нажатый тобою в конце enter )
81h - пробел
82h - начало твоей строки.
И всё нормально. А насчёт пробела по 80h - так это ты наверное ввёл 20h символов.
Ответ отправлен: 26.11.2002, 19:46
Отправитель: keleb-glin
Вопрос № 1925 |
Хотел бы повторить вопрос.
В чем разница при ассемблировании 286....586.
Будет ли изменятся размер проги, вообще хотелось бы знать об этом поподробнее.( в том числе и про команды 586). К сожалению в инете я искал, но не нашел (плохо искал, наверное).
Можете отослать на сопутствующий ресурс (Плииз). И еще, если указать .586, то смогут ли 486 компы выполнять энту прогу.
Заранее благодарен
aka Prophet
jjsp@mail.ru
Вопрос отправлен: 24.11.2002, 14:10
Отправитель: Prophet (jjsp@mail.ru)
[Следующий вопрос >>] [Список вопросов]
Отвечает Gibbel
Здравствуйте, Prophet!
1. Только в наборе команд, которые ты можешь использовать.
2. Нет, размер программы меняться не будет. С другой стороны, ты можешь самостоятельно оптимизировать код, учитывая, что некоторые вещи на более поздних процессорах выполняються меньшим количеством операций.
3. Зайди на любой поисковик и набери Ассемблер
4. Если ты не используешь комманд, специфичных для 586 процессора, то есть, твоя программа приемлема для 486 процессора, то будут без каких-либо проблем.
Ответ отправлен: 25.11.2002, 11:07
Отправитель: Gibbel
Отвечает Maverick
Приветствую Вас, Prophet!
В некоторых случаях размер будет изменятся, вот если на 8086 напишешь:
push 4444h
pop es
то размер будет больше, чем если бы ты написал на .286 то же самое
Ответ отправлен: 24.11.2002, 14:55
Отправитель: Maverick
Отвечает ASMодей
Здравствуйте, Prophet!
Выполнять-то они смогут, но только до первой неизвестной им команды.
Ответ отправлен: 25.11.2002, 06:15
Отправитель: ASMодей
Отвечает Sensey
Доброе время суток, Prophet!
Очень больлшая разница между 286 и 386
В 386 32-битные операторы.
Например, отекомпилил я одну прогу под 286 - 38 кил. Под 386 - 141кило.
Дальше разница поменьше. В 486 добавили всего несколько команд, в 586 еще десяток...
2) Может и смогут, если ты(или компилятор с ЯВУ) не будешь использовать команды 586, например rtdts(кажись так пишется...)
Ответ отправлен: 25.11.2002, 12:12
Отправитель: Sensey
Отвечает Ayl
Доброе время суток, Prophet!
Разница - в разрешении использования команд данного типа процессоров. Размер проги может изменяться в некоторых случаях, в некоторых без указания процессора программа не может быть откомпилирована. Например:
1а.
.Model TINY
.Code
.StartUp
push 0b800h
1б.
.Model TINY
.286
.Code
.StartUp
push 0b800h
В варианте 1а имеем код на 10 байт:
push ax bp
mov bp, sp
mov word ptr [bp+02], 0b800h
pop bp
В варианте 1б - 3 байта за счет использования команды 286-го процессора push imm16
2a.
.Model TINY
.Code
.StartUp
mov eax, 12345678h
2б.
.Model TINY
.386
.Code
.StartUp
mov eax, 12345678h
Здесь при использовании варианта 2а будет выдана ошибка на использование регистра eax. Вариант 2б корректен.
По поводу .586 и возможности выполнения программ на 486 процессоре... Ну если в программе не будут использоваться команды 586-го, то без проблем... Иначе - опаньки!
Ответ отправлен: 25.11.2002, 13:06
Отправитель: Ayl
Отвечает Bob Johnson
Доброе время суток, Prophet!
Когда ты указываешь тип проца - ты это только компилятору указываешь и он разрешает тебе применять его команды (этого проца). Но ты можешь их и не применять, тогда твоя прога будет работать и на более младшей модели. Но вот если уж ты используюешь какую-нибудь команду от пентиума (например, cmpxchg8b) на 486, то тогда твоя программа не будет работать.
А команд новых в пне по сравнению с четверкой достаточно много. Можешь почитать доку от nasm - там есть список команд.
Ответ отправлен: 25.11.2002, 13:36
Отправитель: Bob Johnson
Отвечает Andrew Vext
Добрый день, Prophet!
Разница в наборе команд процессора. Директивы .286, .386 и т.д. указывают ассемблеру какие команды проглатывать, а какие выплевывать как несуществующие.
Ответ отправлен: 25.11.2002, 14:47
Отправитель: Andrew Vext
Вопрос № 1926 |
Уважаемый Maverick, а также другие эксперты.
Скиньте (плиииз) исходники Юрова, о которых вы писали на jjsp@mail.ru
Если можно узнать, то откуда вы их скачали?
aka Prophet
Вопрос отправлен: 24.11.2002, 14:16
Отправитель: Prophet (jjsp@mail.ru)
[Следующий вопрос >>] [Список вопросов]
Отвечает Maverick
Здравствуйте, Prophet!
www.piter.com
По заявкам автора там есть последняя версия.
Ответ отправлен: 25.11.2002, 10:22
Отправитель: Maverick
Вопрос № 1927 |
Здравствуйте, ув. эксперты!
1. Почему, хотя стек начинается с 0FFFFh (так в рассылке по ассемблеру написано), регистр SP в начале выполнения кода указывает на 0FFFEh?
2. Куда указывают метки - на смещение предыдущей или следующей после метки команды?
3. Где можно взять расшифровку всех команд и операторов ассемблера (перевод их на человеческий язык)? (Тогда гораздо легче запоминать становится)
PS: Не по теме, но вдруг! Уже давно ищу учебник по языку .bat файлов. Где его можно взять, не подскажете?
Заранее спасибо :) .
Вопрос отправлен: 24.11.2002, 15:31
Отправитель: Matthew
[Следующий вопрос >>] [Список вопросов]
Отвечает Maverick
Добрый день, Matthew!
Конечно они указывают на смещение команды, которая стоит после метки.
......
mov ah,1
metka:
mov ah,2
jmp metka
.......
Погляди это в отладчике и все станет ясно.
Ответ отправлен: 25.11.2002, 11:13
Отправитель: Maverick
Отвечает ASMодей
Добрый день, Matthew!
1. Потому что стек указывает не на байт, а на слово, и уменьшается
и увеличивается соответственно на 2 байта.
2. Конечно следующей.
3. Что же тут расшифровывать - все команды есть по сути сокращения
английских слов, например MOV - MOVe, MOVSB - MOVe String Byte,
JMP - JuMP, JNZ - Jump if Not Zero, и т.д.
Ответ отправлен: 25.11.2002, 06:16
Отправитель: ASMодей
Отвечает Sensey
Доброе время суток, Matthew!
1) Стек выровнен на слово
2) На следующую
3) Учи английский, все равно пригодится...
4) www.dospage.by.ru
Ответ отправлен: 25.11.2002, 12:16
Отправитель: Sensey
Отвечает Ayl
Добрый день, Matthew!
1. Стек представляет собой набор слов(!). Соответственно, при выполнении команды push xxyy производятся операции:
mov byte ptr ss:[sp], yy
mov byte ptr ss:[sp+1], xx
sub sp, 2
Поэтому sp всегда содержит четное число!
В 32-х разрядном режиме esp содержит число, делящееся на 4.
(ну, не всегда, а чаще всего. Никто не мешает тебе самому установить sp на неченое смещение. Правда, скорость работы замедлится за счет обращения к памяти не по границе слова).
2. Метка указывает на первый байт текущей команды (записанной после метки).
Ответ отправлен: 25.11.2002, 13:22
Отправитель: Ayl
Отвечает Bob Johnson
Здравствуйте, Matthew!
1. Там лежит слово - 0 для того, чтобы ты мог выполнить ret в конце своей программы. А вот по адресу 0 лежит команда int 20, которая завершает программу
2. Не понял :-( Метка считается адресом следующей за ней команды - это?
3. В книге, например "Архитектура и программирование i486".
Ответ отправлен: 25.11.2002, 13:36
Отправитель: Bob Johnson
Отвечает keleb-glin
Здравствуйте, Matthew!
В .СОМ - файле sp указывает но 0fffeh, т.к. в самый конец стека ( байты 0ffffh и 0fffeh ) кладётся 00000000 - адрес начала единого сегмента в твоей проге. А там находится команда int 20h ( в машинных кодах - cd20 ), которая осуществляет выход из проги. Просто таким образом осуществлялось завершение программы в ранних версиях ДОС'а, только там надо было положить в стек 00000000 самостоятельно. Но даже и сейчас такой способ выхода удобен. Если ты оставишь в стеке только последние 2 байта ( 0ffffh и 0fffeh ), а потом напишешь ret, прога перейдёт по адресу, что записан в стеке и завершится. А команда ret занимает всего 1 байт.
Ответ отправлен: 26.11.2002, 19:36
Отправитель: keleb-glin
Вопрос № 1928 |
В программе символы, полученные с клавиатуры, заносятся в переменную, а после нажатия Esc переменная выводится. У меня вопрос: почему если один из символов энтэр то переменная становится пустой?
В программе я энтэр заменил пробелом. Что можно сделать, чтобы Enter оставался Enter'ом?
masm
CSEG segment
assume cs:cseg,ds:cseg,es:cseg,ss:cseg
org 100h
Begin:
mov bx,0
Pressing:
mov ah,1
int 21h
cmp al,27
je Quit
cmp al,0dh
je Change
Continue:
mov Final[bx],al
inc bx
jmp Pressing
Quit:
mov bx,45
mov Final[bx],'$'
mov ah,9
mov dx,offset Mess_1
int 21h
mov ah,9
mov dx,offset Final
int 21h
mov ah,9
mov dx,offset Mess_2
int 21h
int 20h
Change:
mov al,00
jmp Continue
Mess_2 db 0dh,0ah,'End$'
Mess_1 db 0dh,0ah,'You entered:',0dh,0ah,'$'
Final db 45 dup (' ')
Place db ?
Number db ?
CSEG ends
end Begin
Вопрос отправлен: 24.11.2002, 21:41
Отправитель: Faraon (qwqwqwooo@rambler.ru)
[Следующий вопрос >>] [Список вопросов]
Отвечает Maverick
Добрый день, Faraon!
Я не понял, что ты хочешь чтоб твоя программа выводила?
Например ввели 1-enter-1 она выводит:
1 1
А тебе как надо?
Напиши подробнее.
Ответ отправлен: 25.11.2002, 11:13
Отправитель: Maverick
Отвечает Bob Johnson
Здравствуйте, Faraon!
Скорее всего просто потому, что код 0D (Enter) приводит к тому, что функция 9 начинает печатать дальнейший текст с первого символа текущей строки (т.е. затирает то, что ранее вывела).
Ответ отправлен: 25.11.2002, 13:37
Отправитель: Bob Johnson
Отвечает keleb-glin
Здравствуйте, Faraon!
Чтобы enter был enter'ом ( строка переносилась ) надо его нажатие транслировать не просто в символ 13 ( 0dh ), а в пару 10 и 13 ( 0ah и 0dh ). Первый - перенос строки, а второй - enter - просто "возврат каретки" - курсор переместится к началу строки. После того, как при печати встретится этот код, курсор переведётся к началу строки, и следующие после введённых символов пробелы затрут всё, уже напечатавшееся. А переменная не обнуляется.
Приложение:
Ответ отправлен: 27.11.2002, 20:41
Отправитель: keleb-glin
Вопрос № 1929 |
Уважаемые эксперты, я по вопросу N 1910 (как разделить 32 бит число при помощи 16 бит регистров). Спасибо вам за ответы а вот если поделить число типа long int = 4294967295
на word или ... =2 или 3 где будет остаток а где нужный результат?
Где можно найти как делить разные числа?
Вопрос отправлен: 24.11.2002, 23:18
Отправитель: Merilyn Manson
[Следующий вопрос >>] [Список вопросов]
Отвечает Maverick
Добрый день, Merilyn Manson!
У Юрова не плохо описаны математические операции.
В чем проблема, напиши простенький код и посмотри в отладчике, где что находится.
Ответ отправлен: 25.11.2002, 11:13
Отправитель: Maverick
Отвечает Bob Johnson
Добрый день, Merilyn Manson!
Ты имеешь ввиду, как разделить очень большое число на очень маленькое? Если (при работе с 16-разрядными регистрами) результат деления (который в ах) не влазит в него, возбуждается особый случий переполнения деления (т.е. деление на 0) - вот и все. Именно поэтому на быстрых компьютерах не работает старый borland pascal... Для этого деление нужно осуществлять в два этапа - сначала старшую часть, затем младшую.
Ответ отправлен: 25.11.2002, 13:37
Отправитель: Bob Johnson
Форма отправки вопроса |
Форма может работать некорректно в почтовых программах "Microsoft Outlook" и "Microsoft Outlook Express". В программе The Bat! подобные формы не работают вообще!
После нажатия на кнопку "Отправить", будет открыто второе окно. Заметьте, что в некоторых браузерах могут стоять запреты на открытие других окон, а также "чрезмерное" кэширование данных, при этом факт отправки Вашего вопроса стоит под сомнением.
Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+ или отправлять вопросы с сайта по адресу: http://rusfaq.ru/cgi-bin/Message.cgi.
© 2002 Команда RusFAQ.ru.
Вопрос и дополнение |
Ваш вопрос:
Приложение (если необходимо):
Получить ответов:
Выбор рассылки |
Программисту Assembler (41) C / C++ (29) Perl (9) Delphi (14) Pascal (22) Basic / VBA (10) Java / JavaScript (15) PHP (10) MySQL / MSSQL (9) |
Пользователю Windows 95/98/Me (35) Windows NT/2000/XP (22) "Железо" (27) Поиск информации (16) |
Администратору Windows NT/2000/XP (12) Linux / Unix (17) |
Юристу Гражданское право (9) Семейное право (3) Трудовое право (5) КоАП (3) |
Отправить вопрос всем экспертам выбранной рассылки.
© 2002 Россия, Москва. Авторское право: RusFAQ.ru |
http://subscribe.ru/
E-mail: ask@subscribe.ru |
Отписаться
Убрать рекламу |
В избранное | ||