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

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


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Assembler (Ассемблер)

Выпуск № 566
от 07.10.2006, 22:05

Администратор:Калашников О.А.
В рассылке:Подписчиков: 346, Экспертов: 32
В номере:Вопросов: 3, Ответов: 7


Вопрос № 57394: Здравствуйте.. обьясните пожалуйсто в чем тут дело? Есть такая программа: ---------------------------------------------------------------------------------------- include userv.mac data segment x dw 10 dup(?) s ...
Вопрос № 57435: при попытке вызвать int 21h из под VC6++ под WinXP. При помощи конструкции: __asm {.... int 21h ...}; Программа валится с сообщением Access voliation. Сделал дебаг, программа входит в прерывание и через определенный момент на тыкается на...
Вопрос № 57472: Уважаемые эксперты. опять хочу прибегнуть к Ващей помощи, пусть имеется код на паскале ...... write('VVedite X:'); readln(x); write('VVELI X=',x); ....... Пожалуйсто перебейте под Asm, т.е. хочу понять как правильно польз...

Вопрос № 57.394
Здравствуйте.. обьясните пожалуйсто в чем тут дело?
Есть такая программа:

----------------------------------------------------------------------------------------

include userv.mac

data segment
x dw 10 dup(?)
s dw ?
data ends

code segment
assume cs: code, ds: data
start:
mov ax,data
mov ds,ax
mov cx,10
mov bx,0
vvodx:
u_key_bin<13,10,'Vvedite x: '>
mov x[bx],ax
add bx,2
dec cx
jcxz sump
jmp vvodx
sump:
mov cx,10
mov bx,0
mov s,0
cikl:
cmp x[bx],0
jle menshe
mov ax,x[bx]
add s,ax
menshe:
add bx,2
loop cikl
mov ax, s
u_show_bin<13,10,'Summa polojitelnih chisel='>
mov ah,4Ch
int 21h
code ends

stack segment stack
dw 64 dup(?)
stack ends

end start

----------------------------------------------------------------------------------------

Сама программа компилируется, но почемуто при создании *.EXE возникает ошибка:
----------------------------------------------------------------------------------------

LINK : fatal error L1127: far segment references not allowed with /TINY

----------------------------------------------------------------------------------------

большое спасибо ))
Отправлен: 02.10.2006, 02:34
Вопрос задал: Глеб (статус: Посетитель)
Всего ответов: 4
Мини-форум вопроса >>> (сообщений: 2)

Отвечает: ADSota
Здравствуйте, Глеб!

Модель памяти TINY предпологает что все данные и код находяться в одном сегменте. Поменяй модель памяти ключами в файле userv.mac или сгруппируй их (DGROUP) или сам перенеси все в один сегмент.
---------
Открыть глаза навстречу солнцу
Ответ отправил: ADSota (статус: Специалист)
Ответ отправлен: 02.10.2006, 09:27

Отвечает: Волков Павел Юрьевич
Здравствуйте, Глеб!
Размер кода не велик, можно все разместить в одном сегменте (*.com файл, модель - TINY)
----------------/Результат зависит от userv.mac/----------------------------------
include userv.mac

code segment
assume cs: code, ds: data
start:
mov ax,data
mov ds,ax
mov cx,10
mov bx,0
vvodx:
u_key_bin<13,10,'Vvedite x: '>
mov x[bx],ax
add bx,2
dec cx
jcxz sump
jmp vvodx
sump:
mov cx,10
mov bx,0
mov s,0
cikl:
cmp x[bx],0
jle menshe
mov ax,x[bx]
add s,ax
menshe:
add bx,2
loop cikl
mov ax, s
u_show_bin<13,10,'Summa polojitelnih chisel='>
mov ah,4Ch
int 21h

x dw 10 dup(?)
s dw ?

code ends
end start
----------------//----------------------------------
Тогда ключи менять не надо.
---------
Век живи, век учись.
Ответ отправил: Волков Павел Юрьевич (статус: 8-ой класс)
Ответ отправлен: 02.10.2006, 15:21

Отвечает: Fluxx
Здравствуйте, Глеб!
Скорее всего ошибка происходит мз-за того, что вы запускаете ml.exe с параметром /AT. Компилятор пытается создать .COM файл, а это невозможно при наличии нескольких сегментов. Попробуйте запускать ml.exe без параметров.
Ответ отправил: Fluxx (статус: 1-ый класс)
Ответ отправлен: 02.10.2006, 15:31

Отвечает: ENS
Здравствуйте, Глеб!
Когда не ставят модель подразумевается TINY т.е. данные, код в одном сегменте.А у Вас все в разных - это small.
Ставьте диррективу .model small .
С уважением, ENS.

---------
Учение - свет!
Ответ отправил: ENS (статус: 5-ый класс)
Ответ отправлен: 02.10.2006, 20:01


Вопрос № 57.435
при попытке вызвать int 21h из под VC6++ под WinXP.
При помощи конструкции: __asm {.... int 21h ...};
Программа валится с сообщением Access voliation.
Сделал дебаг, программа входит в прерывание и через определенный момент на тыкается на некую ассемблерную комманду "sysent"
при выполнении которой и происходит ошибка.
Посмотрел библиотеки у Borland C++ Builder 6 в частности dos.h
Там есть возможность использования intr(21h...), толоко вот работоспособность я непроверял, т.к. биледер неустанавливал. неужели

он Может? И еще есть у него в dos.h возможность обращатся к BDOS и к Int 13h
У VC Dos.h практически пустой, поэтому я также пробовал обратится через __ASM к int 13h и тоже получил ошибку.=(

Вопросы:
1.Как я могу непосредственно работать с секторами диска?
2.Как я могу поличить доступ к функциям int 13h или хотябы int 21h ?
3.Почему ошибка возникает?
4. Дело в том что функции работы с файлами из kernel (_lopen, _ lclose) имеют одинаковую функцилнальность с int 21h, НО

некоторые скрытые возможности в них работают некорректно.
Отправлен: 02.10.2006, 14:18
Вопрос задал: DDMZ (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 3)

Отвечает: Fluxx
Здравствуйте, DDMZ!
1. К сожалению, работа непосредственно с секторами дисков невозможна в Windows. Видимо вам придется воспользоваться Borland C++ Builder под DOS-ом для получения желаемого результата.
2. Доступ к прерываниям, равно как и портам ввода вывода запрещен в Windows в целях безопасности. Вся работа с устройствами происходит через API.
3. Оибка возникает из-за того, что к прерываниям невозможно обращаться из защищенного режима, в котором работает Windows.
Ответ отправил: Fluxx (статус: 1-ый класс)
Ответ отправлен: 02.10.2006, 15:31

Отвечает: Jekyll
Здравствуйте, DDMZ!

1) Работать с секторами диска можно через тот же CreateFile, в параметры надо передавать имя диска (что-то вроде \.C) посмотри MSDN
2) Доступ к прерываниям можно получить написав драйвер, который бы разрешал user-level программе их использовать. Поищи на wasm.ru - там есть пример.
3) Если собираешся работать под Windows, то нужно забыть прерывания ДОСа, либо читай пункт 2.

Ответ отправил: Jekyll (статус: 2-ой класс)
Ответ отправлен: 02.10.2006, 17:00


Вопрос № 57.472
Уважаемые эксперты. опять хочу прибегнуть к Ващей помощи, пусть имеется код на паскале
......
write('VVedite X:');
readln(x);
write('VVELI X=',x);
.......

Пожалуйсто перебейте под Asm, т.е. хочу понять как правильно пользоваться операциями ввода/вывода.
ЗЫ прошу прощение за повторение сабжа, просто в вопросе ниже не очень был понятен ответ.
ЗЫЗЫ и еще просьба прокоментировать написанное...
Огромное спасибо.
Отправлен: 02.10.2006, 19:53
Вопрос задал: Глеб (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 3)

Отвечает: ENS
Здравствуйте, Глеб!Так вот этот
кусок кода на на асме выглядит как в приложении. Советую сначало разобраться. Если ты хуть немного знаком с языком то для тебя НО ПРОБЛЕМ разобраться
С уважением,ENS.

Приложение:

---------
Учение - свет!

Ответ отправил: ENS (статус: 5-ый класс)
Ответ отправлен: 03.10.2006, 19:41


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

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

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2006, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Версия системы: 4.37 от 04.10.2006
Яндекс Rambler's Top100

В избранное