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

RusFAQ.ru: программирование на языке Assembler


Информационный Канал Subscribe.Ru

RusFAQ.ru: программирование на языке Assembler

Выпуск № 735
от 02.06.2004, 17:50

Администратор:
Имя: Калашников О.А.
URL: Информационный ресурс
ICQ: 68951340
Россия, Москва
О рассылке:
Задано вопросов: 5391
Отправлено ответов: 14831
Активность: 275.1 %
[Задать вопрос >>][Регистрация эксперта >>]
[Поиск в базе][Обсудить на форуме]


 Список экспертов, ответы которых опубликованы в данном выпуске

Ayl
Статус: Профессиональный
Общий рейтинг: 116.61
[Подробней >>]
Black
Статус: Начальный
Общий рейтинг: 114.63
[Подробней >>]
Foamplast
Статус: Профессиональный
Общий рейтинг: 150.17
URL: мой личный сайт
[Подробней >>]
 
Евгений Иванов
Статус: Профессиональный
Общий рейтинг: 134.11
URL: Super Assembler Software
Телефон: НСС +7 831 3107039
[Подробней >>]
Стас
Статус: Доверительный
Общий рейтинг: 128
[Подробней >>]
Pawel
Статус: Профессиональный
Общий рейтинг: 154.22
[Подробней >>]
 
_vt
Статус: Профессиональный
Общий рейтинг: 118.67
[Подробней >>]
Dragoon
Статус: Доверительный
Общий рейтинг: 107.29
[Подробней >>]
Dark_Lord
Статус: Профессиональный
Общий рейтинг: 109.6
[Подробней >>]
 
VOVAN
Статус: Опытный
Общий рейтинг: 105.5
[Подробней >>]


 Краткий перечень вопросов

Вопрос № 5349. как вызвать функцию if?... (ответов: 3)
Вопрос № 5350. Привет!! Это снова я. Есть следуйщий код: void f(){ int code; ExitProcess(code); \ 'x0x40x17x0' } in... (ответов: 2)
Вопрос № 5351. Здравствуйте, эксперты! Имеется комплекс измерения количества газа СГ-ЭК, в состав которого входит д... (ответов: 1)
Вопрос № 5352. ПривЕт!! Где я могу найти базу ассемблерных кодов? К примеру: add eax, edx будет выглядеть как (66 0... (ответов: 4)
Вопрос № 5353. Здравствуйте, уважаемые эксперты! Ответьте мне, пожалуйста, вот на какой вопрос: UART 16550A имеет б... (ответов: 1)
Вопрос № 5354. Здоровенькі були, шановні експерти! Скажите пожалуйста, где можно взять архив рассылки asmFAQ rusfaq... (ответов: 2)
Вопрос № 5355. Здравствуйте Уважаемые Эксперты!!! Объясните плиз,понятие OVERLAPPED . Зарание благодарен!... (ответов: 2)
Вопрос № 5356. Привет!! Вопрос совсем тупой: Как скопировать b в a?... (ответов: 6)
Вопрос № 5358. Здарова. Пишу в test.asm: mov AH,00 ;функция 0 прерывания 16h int 16h ;читать код нажатой клавиш... (ответов: 7)

Вопросов: 9, ответов: 28


 Вопрос № 5349

как вызвать функцию if?



Вопрос отправлен: 27.05.2004, 20:13
Отправитель: petya

[Следующий вопрос >>] [Список вопросов]

Отвечает Ayl

Добрый день, petya!
Функцию? Вообще-то if - это оператор. Его на асме можно написать так:
; if a < b then max := b else max := a;
mov ax, [a]
cmp ax, [b]
jl less
mov ax, [b]
less:
mov [max], ax

То есть, командой cmp сравниваем 2 значения (т.к. в процессоре нет команд типа память-память, то одно из значений заносим в регистр), и далее в зависимости от установленных этой командой флагов делаем условный переход. В приведенном кода jl обозначает переход, если первый операнд команды cmp меньше второго (числа беззнаковые).


Ответ отправлен: 28.05.2004, 12:30
Отправитель: Ayl


Отвечает Black

Добрый день, petya!
Есть оператор, который проверяет значение регистра и при несовпадении установливает флаг, например:
mov ax,10h
cmp ax,10h - флаг не будет установле
или
mov ah,5h
cmp ah,9h - флаг станет равным 1

Ответ отправлен: 28.05.2004, 00:17
Отправитель: Black


Отвечает Foamplast

Добрый день, petya!
Так же, как и любую другую, если это действительно функция.
Во многих случаях это не функция, а макрос или директива, употребление которых отличается от употребления функций.


Ответ отправлен: 31.05.2004, 19:11
Отправитель: Foamplast


 Вопрос № 5350

Привет!!
Это снова я.
Есть следуйщий код:
void f(){
int code;
ExitProcess(code); \ 'x0x40x17x0'
}
int main(){
char a[4];
char b[] = "00001111"
"x0x17x40x0";
strcpy(a,b);
}
Здесь мы видим что происходит переполнение буфера, т.е. "1111" залетело в регистр ESP, x0x17x40x0 в EIP, и указывает на адрес где исполняется функция ExitProcess. Так как ExitProcess имеет один аргумент(uExitCode) то как можно сделать чтоб ExitProcess вызывался с дургим аргументом?



Вопрос отправлен: 27.05.2004, 20:37
Отправитель: petya

[Следующий вопрос >>] [Список вопросов]

Отвечает Евгений Иванов

Добрый день, petya!
Во первых, дурь всё это - переполнение буфера.
Не понимаю, как могут людей дурить с этим?!
Ну неужели функция strcpy не проверяет размер выходного буфера при копировании?
Это каким же надо быть программистом, чтобы такое допустить?!
Смех :))
* EMan: -=- Любовь существует! =-=


Ответ отправлен: 29.05.2004, 05:17
Отправитель: Евгений Иванов


Отвечает Foamplast

Доброе время суток, petya!
Поставить вместо x0x17x40x0 адрес, указывающий на стек, а в нём написать необходимый код путём внесения в строку b.


Ответ отправлен: 31.05.2004, 19:15
Отправитель: Foamplast


 Вопрос № 5351

Здравствуйте, эксперты!
Имеется комплекс измерения количества газа СГ-ЭК, в состав которого входит датчик измерения количества газа и электронный корректор объема газа ЕК260. Необходимо вывести показания датчика (объемный расход газа, температура, давление и т.п.) через промышленный контроллер «Yokogawa» на компьютер, совместимый с IBM PC.
Данный контроллер принимает данные только по протоколу MODBUS (интерфейс RS-232C). СГ-ЭК отправляет данные по другому протоколу (интерфейс RS-232C). Было разработано следующее решение: поставить между комплексом измерения количества газа СГ-ЭК и контроллером «Yokogawa» программируемый MicroPC компании Octagon Systems модели 5066 (Процессор 586). Он имеет два последовательных порта (интерфейс RS-232C) COM1 и COM2. В постоянном запоминающем устройстве (ПЗУ) данного MicroPC имеется операционная система ROM-DOS, совместимая с MS DOS 6.22.
Задача MicroPC – принимать запрос от PLC «Yokogawa», конвертировать его в запрос, понятный для ЕК260, запрашивать ЕК260, получать ответ от ЕК260, конвертировать этот ответ и отправлять его PLC «Yokogawa» по протоколу MODBUS.
В приложении приведен алгоритм программы.
При разработке данного алгоритма возникли следующие вопросы:
1)Какие размеры буфера выбрать, чтобы данные не терялись, затирались?
2)Есть ли ошибки, недочеты, замечания в алгоритме?
3)Есть ли алгоритм лучше, проще, надежнее?
4)Какие могут возникнуть трудности при наладке данного проекта?


Приложение:


Вопрос отправлен: 27.05.2004, 23:53
Отправитель: Эдуард

[Следующий вопрос >>] [Список вопросов]

Отвечает Стас

Добрый день, Эдуард!
Я бы, всё же, вызавал отправку буфферов в порт сразу после его перекодирования. А не ждал CASE.
Размер буфферов рассчитать сложно. Я бы опытным путем определил, написал прогу сколько принимается в какие промежутки времени. Удвоил или утроил этот размер.
Можно сделать по 64K. 4 буффера по 64 = 256K - нормально по моему.

Ответ отправлен: 28.05.2004, 00:43
Отправитель: Стас


 Вопрос № 5352

ПривЕт!!
Где я могу найти базу ассемблерных кодов? К примеру: add eax, edx будет выглядеть как (66 03 C2)



Вопрос отправлен: 28.05.2004, 13:56
Отправитель: qh

[Следующий вопрос >>] [Список вопросов]

Отвечает Pawel

Доброе время суток, qh!
DDK
На wasm.ru есть прога.

Ответ отправлен: 30.05.2004, 20:03
Отправитель: Pawel


Отвечает _vt

Добрый день, qh!
Введи запрос в поисковик - "pentium.zip". Должно помочь! :)
* Origin : Life begins at 1000Mhz!


Ответ отправлен: 30.05.2004, 21:38
Отправитель: _vt


Отвечает Foamplast

Доброе время суток, qh!
Каждому процессору - свои коды.
Для процессоров фирмы Intel смотри на http://www.intel.com
Для процессоров AMD смотри на http://www.amd.com
Для процессоров Analog Devices смотри на http://www.analog.com
Для процессоров Atmel смотри на http://www.atmel.com
...
Для процессоров фирмы X смотри на http://www.X.com


Ответ отправлен: 30.05.2004, 14:51
Отправитель: Foamplast


Отвечает Евгений Иванов

Доброе время суток, qh!
HIEW
* EMan: -=- Любовь существует! =-=


Ответ отправлен: 29.05.2004, 05:22
Отправитель: Евгений Иванов


 Вопрос № 5353

Здравствуйте, уважаемые эксперты!
Ответьте мне, пожалуйста, вот на какой вопрос:
UART 16550A имеет буфер FIFO размером 16 байт. Но максимально возможное количество байтов для использования равно 14. На что оставшиеся 2 байта?
Если не использовать буферизацию (без FIFO), то приходящий символ (байт) можно прочитать из регистра данных, находящегося по базовому адресу COM порта. Прерывание возникает каждый раз по приходу нового символа. В этом обработчике прерывания мы считываем пришедший символ из регистра данных в свой промежуточный буфер. При использовании FIFO прерывание возникает только тогда, когда FIFO-буфер заполнен, т.е. пришли 14 символов. Как мне в своем обработчике прерывания считывать эти данные из буфера FIFO? По какому адресу он располагается? В описании для UART 16550A приводятся только описание 8-битных регистров.
Заранее благодарю всех ответивших!



Вопрос отправлен: 28.05.2004, 15:20
Отправитель: Эдуард (hied345@mail.ru)

[Следующий вопрос >>] [Список вопросов]

Отвечает Евгений Иванов

Добрый день, Эдуард!
Буфер внутренний и совершенно прозрачный.
* EMan: -=- Любовь существует! =-=


Ответ отправлен: 29.05.2004, 05:22
Отправитель: Евгений Иванов


 Вопрос № 5354

Здоровенькі були, шановні експерти!
Скажите пожалуйста, где можно взять архив рассылки
asmFAQ rusfaq.ru ? (т.е. этой рассылки)
я искал на сайте rusfaq.ru, не нашёл.
может плохо искал?
или может надо искать на subscribe.ru?



Вопрос отправлен: 28.05.2004, 16:29
Отправитель: soflot (soflot@ukr.net)

[Следующий вопрос >>] [Список вопросов]

Отвечает Евгений Иванов

Здравствуйте, soflot!
Именно, второе.
* EMan: -=- Любовь существует! =-=


Ответ отправлен: 29.05.2004, 05:24
Отправитель: Евгений Иванов


Отвечает Foamplast

Доброе время суток, soflot!
Да


Ответ отправлен: 31.05.2004, 19:16
Отправитель: Foamplast


 Вопрос № 5355

Здравствуйте Уважаемые Эксперты!!!
Объясните плиз,понятие OVERLAPPED .
Зарание благодарен!



Вопрос отправлен: 28.05.2004, 17:21
Отправитель: vlad

[Следующий вопрос >>] [Список вопросов]

Отвечает Евгений Иванов

Доброе время суток, vlad!
Наложение.
Перекрывающиеся.
* EMan: -=- Любовь существует! =-=


Ответ отправлен: 29.05.2004, 05:25
Отправитель: Евгений Иванов


Отвечает Pawel

Здравствуйте, vlad!
перекрывание.
В каком контексте то ?

Ответ отправлен: 30.05.2004, 20:00
Отправитель: Pawel


 Вопрос № 5356

Привет!!
Вопрос совсем тупой:
Как скопировать b в a?


Приложение:


Вопрос отправлен: 28.05.2004, 20:38
Отправитель: qh

[Следующий вопрос >>] [Список вопросов]

Отвечает Евгений Иванов

Приветствую Вас, qh!
"a" меньше, чем "b", поэтому это нельзя сделать правильно.
Нужно сделать "с" размером a+b и потом скопировать "a" и "b".
Усё.
* EMan: -=- Любовь существует! =-=


Ответ отправлен: 29.05.2004, 05:26
Отправитель: Евгений Иванов


Отвечает Ayl

Здравствуйте, qh!
Скопировать тебе вряд ли удастся в твоем примере, т.к. длина строки a меньше длины строки b, поэтому при копировании ты затрешь начало строки b. Так что для нормального копирования сделай сначала строки равными.
А копируется строка очень просто:
a db 'hello, world!'
a_len equ $ - a
db 0
b db a_len dup (?), 0
; вариант 1 до символа 0
lea si, a
lea di, b
@@loop:
lodsb
or al, al
stosb
jnz @@loop
; вариант 2 по длине строки
lea si, a
lea di, b
mov cx, a_len
rep movsb


Ответ отправлен: 29.05.2004, 15:42
Отправитель: Ayl


Отвечает Dragoon

Доброе время суток, qh!
B в a ты никак не скопируешь - у тебя a меньше, чем b


Ответ отправлен: 30.05.2004, 10:10
Отправитель: Dragoon


Отвечает Стас

Доброе время суток, qh!
В ассемблере все так просто. Но надо понять сначала что есть Assembler.
Так вот, в ассемблере не существует переменных! Ты сам создаешь переменную, определяешь как она должна выглядить, сколько байт заниать, как кодироватся.
В твоем случае есть два "кусочка памяти" A - размером 4 байта и B - 12 байт. Скопировать B в A можно только затерев при этом часть B. т.е. у тебя получиться A="hello world" B="o world" =>
a db "hell"
b db "o world",0
Если же ты хочешь сделать это копирование корректно то должен был предусмотреть место для данных в переменной А, т.е. так:
a db "aaa",0,12-4 dup (0)
b db "hello world",0
Вообщем примерно так.

Ответ отправлен: 28.05.2004, 22:13
Отправитель: Стас


Отвечает Foamplast

Доброе время суток, qh!
Ну, под "Виндовс" можно совсем просто: lstrcpy(a,b); Я сам так и делаю.
А можно так (всегда и везде на х86):
    Mov     Edi, a
Mov Esi, b
Xor Eax, Eax

.loop
Lodsb
Stosb
Test Al, Al

Jnz .loop
Если программа работает под ОС, а не под голым компьютером, то имеет смысл использовать её функции, это часто уменьшает размер программы.


Ответ отправлен: 30.05.2004, 14:52
Отправитель: Foamplast


Отвечает Pawel

Приветствую Вас, qh!
НИКАК. b болше чем a

Ответ отправлен: 30.05.2004, 19:58
Отправитель: Pawel


 Вопрос № 5358

Здарова.
Пишу в test.asm:
mov AH,00 ;функция 0 прерывания 16h
int 16h ;читать код нажатой клавиши
Компилю. Запускаю и бац "The instruction at '0x00401002' referenced memory at '0xffffffff'. The memory could not be 'read'"....
Что делать?



Вопрос отправлен: 29.05.2004, 17:49
Отправитель: voxel

[Следующий вопрос >>] [Список вопросов]

Отвечает Dark_Lord

Добрый день, voxel!
Судя по ошибке ты пытаешься сделать программу под Windows, а там прерывания запрещены (обычному программисту или юзеру)

Ответ отправлен: 30.05.2004, 12:58
Отправитель: Dark_Lord


Отвечает Pawel

Добрый день, voxel!
Нда. А Ты не в курсе, что в Win на ring-0 нет прерываний, только api функции от дяди Била.

Ответ отправлен: 30.05.2004, 19:54
Отправитель: Pawel


Отвечает VOVAN

Здравствуйте, voxel!
просто ты делаешь под винду, а там нема прерываний.

Ответ отправлен: 31.05.2004, 20:03
Отправитель: VOVAN


Отвечает Евгений Иванов

Здравствуйте, voxel!
Вопрос не корректен. Нет достаточно данных для ответа.
* EMan: -=- Любовь существует! =-=


Ответ отправлен: 29.05.2004, 22:29
Отправитель: Евгений Иванов


Отвечает Стас

Добрый день, voxel!
Нужен весь текст программы как ты его пишешь, и команды как компилируешь. Какая ОС?

Ответ отправлен: 29.05.2004, 19:41
Отправитель: Стас


Отвечает Foamplast

Приветствую Вас, voxel!
Запускать под ДОС.


Ответ отправлен: 31.05.2004, 19:16
Отправитель: Foamplast


Отвечает _vt

Приветствую Вас, voxel!
Наверное, API MS-DOS в MS-Windows не используется... ;)
* Origin : Life begins at 1000Mhz!


Ответ отправлен: 01.06.2004, 03:06
Отправитель: _vt



Форма отправки вопроса

Внимание!
Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+ или отправлять вопросы с сайта по адресу: http://rusfaq.ru/cgi-bin/Message.cgi.

(C) 2002-2003 Команда RusFAQ.ru.

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

Ваше имя:

Ваш e-mail:

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


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

Ваш вопрос:


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


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


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

Программисту
Assembler (20)
C / C++ (14)
Builder / Delphi (17)
Pascal (20)
Basic / VBA (2)
Java / JavaScript (4)
PHP (13)
Криптография (7)
WinAPI (9)
Радиоэлектроника (10)
Пользователю
Windows 95/98/Me (34)
Windows NT/2000/XP (48)
"Железо" (30)
Поиск информации (16)
Администратору
Windows NT/2000/XP (21)
Linux / Unix (7)
Юристу
Гражданское право (12)
Семейное право (9)
Трудовое право (12)
КоАП (8)

Отправить вопрос всем экспертам выбранной рассылки.




Задать вопрос | Регистрация эксперта | Поиск в базе | Чат | Форумы | Новости
Проект экспертов RusFAQ.ru | Фотоальбом | Virus.RusFAQ.ru | Администрирование
Профессиональная WEB-Студия B.I.T.


Яндекс цитирования
© 2001-2004 Россия, Москва. Авторское право: Калашников О.А.


http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу


В избранное