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

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.

 Персональные данные

Ваше имя:

Ваш e-mail:

Опубликовать мой e-mail в рассылке


 Вопрос и дополнение

Ваш вопрос:


Приложение (если необходимо):


Получить ответов:


 Выбор рассылки

Программисту
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
Отписаться
Убрать рекламу

В избранное