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

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


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

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

Выпуск № 574
от 16.10.2006, 02:05

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


Вопрос № 58393: Здравствуйте, уважаемые эксперты. Объясните пожалуйста, что такое сегмент памяти и с чем связана именно векторная адресация. Почему адрес это, например, не одно число? Заранее спасибо....
Вопрос № 58462: Здраствуйте. Подскажите пожалуйсто почему когда ввожу первое значение Х равное 2 то при делении (если не ошибаюсь) возникает ошибка. А если первое меньше или =1 а остальные 2 или любые другие то все нормально считает.. вот текст: ======...
Вопрос № 58464: Здравствуйте ! Написал программу, которая ищет файл в директории, указанной пользователем и пытается его открыть. Сначала все работало, пока я не удалил ненужные переменные из начала проги. Сейчас вообще какая то хрень происходит. Не подскажете в чем...

Вопрос № 58.393
Здравствуйте, уважаемые эксперты.
Объясните пожалуйста, что такое сегмент памяти и с чем связана именно векторная адресация. Почему адрес это, например, не одно число?
Заранее спасибо.
Отправлен: 10.10.2006, 14:25
Вопрос задал: Dicot (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Лысков Игорь Витальевич
Здравствуйте, Dicot!
Исторически сложилось, что адресная шина в процессорах 8086/8088 была 20-ти разрядная, а регистры 16-ти разрядные.
Поэтому инженеры Intel-а придумали способ формирования 20-ти разрядного адреса из 16-ти разрядных величин.
Ввели понятие сегмента и смещения. Сегмент - старшие 16 бит адреса. Он всегда выровнен на границу 16 байт.
Смещение - 16-битная величина - адрес от начала сегмента. Т.о., 20-битный адрес вычисляется по формуле Сегмент*16 + Смещение.
Хоть потом и появились 32-разрядные регистры, этот способ адресации оставлен для совместимости с ДОС-овскими программами и BIOS.
32-разрядные регистры дают возможность адресовать 4Гбайт адресного просранства, но для этого необходимо перейти
в защищенный режим работы процессора, что и происходит в Win32.
PS Все это должно быть подробно расписано во всех руководствах :)

---------
Удачи!
Ответ отправил: Лысков Игорь Витальевич (статус: Практикант)
Ответ отправлен: 10.10.2006, 15:00


Вопрос № 58.462
Здраствуйте. Подскажите пожалуйсто почему когда ввожу первое значение Х равное 2 то при делении (если не ошибаюсь) возникает ошибка. А если первое меньше или =1 а остальные 2 или любые другие то все нормально считает..
вот текст:

===================================
include userv.mac
main segment
x dw 7 dup(0)
y dw 7 dup(0)
S dw 0
a dw 0
b dw 0
;Íà÷àëî ãëàâíîé ïðîãðàììû
begin:
mov bx,0
_Vx:
; Ââîä X
u_key_bin <13,10,'Vvedite Xi: '>
mov x[bx],ax
add bx,2
cmp bx,14
je _endVx
jmp _Vx
_endVx:
;Ââîä îñòàëüíûõ ïàðàìåòðîâ (à, b)
u_key_bin <13,10,'Vvedite a: '>
mov a,ax
u_key_bin <13,10,'Vvedite b: '>
mov b,ax
;Äàëåå èäåò öûêë ñ óñëîâèåì ïðîâåðêè
;çíà÷åíèé Õ, ïîëó÷åíèÿ çíà÷åíèÿ Ó
mov bx,0
Cikle:
cmp x[bx],1
ja bolshe
mov ax,a
mov y[bx],ax
mov ax,y[bx]
imul x[bx]
imul x[bx]
sub ax,b
mov y[bx],ax
jmp end_if
bolshe:
mov ax,a
div x[bx]
mov y[bx],ax
mov ax,x[bx]
mul x[bx]
add y[bx],ax
end_if:
add bx,2
cmp bx,20
je exit
jmp Cikle
exit:
mov bx,0
vivod:
mov ax,x[bx]
u_show_bin<13,10,'X = '>
mov ax,y[bx]
u_show_bin<13,10,'Y = '>
add bx,2
cmp bx,14
je endViv
jmp vivod
endViv:
mov ah,10h
int 16h
int 20h
main ends
stack segment stack
dw 64 dup(0)
stack ends
end begin

================================

заранее огромное спасибо =)
Отправлен: 10.10.2006, 23:36
Вопрос задал: Глеб (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Волков Павел Юрьевич
Здравствуйте, Глеб!
При делении
bolshe:
mov ax,a
div x[bx]
mov y[bx],ax
mov ax,x[bx]
mul x[bx]
делимое находиться в регистрах dx:ax, делитель должен быть в два раза меньше делимого(возможные комбинации: qword на dword, dword на word, word на byte), т.к. Вы не очищаете dx - результат не верен. После mul x[bx] возможно переполнение, надо проверять cf.

Успехов.
---------
Век живи, век учись.
Ответ отправил: Волков Павел Юрьевич (статус: 8-ой класс)
Ответ отправлен: 11.10.2006, 08:11

Отвечает: ENS
Здравствуйте, Глеб!
Ошибка в делении. Делимое должно быть больше делителя. И надо обнулять DX.

---------
Если нет выхода ищу вход.
Ответ отправил: ENS (статус: 6-ой класс)
Ответ отправлен: 11.10.2006, 20:03


Вопрос № 58.464
Здравствуйте ! Написал программу, которая ищет файл в директории, указанной пользователем и пытается его открыть. Сначала все работало, пока я не удалил ненужные переменные из начала проги. Сейчас вообще какая то хрень происходит. Не подскажете в чем дело ?

Приложение:

Отправлен: 11.10.2006, 00:17
Вопрос задал: Whiteman (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Стас
Здравствуйте, Whiteman!
Чушь какая-то...
jmp go
go:
mov ax,@data
mov ds,ax
mov es,ax
xor ax,ax

xor bx,bx
mov ah,3fh ;читать файл
mov dx,offset s
mov cx,0ffh
int 21h
jc er3

Сначала читаете файл.

Потом назначаете область DMA:
mov ah,1ah
mov dx,30h
int 21h

Потом ищете его в директории:
mov ah,4eh
mov cx,7
mov dx,offset s
int 21h
причем dx указывает не на маску (lub), а на рабочую область...

И только потом открываете файл на чтение/запись.
mov ax,3d02h
xor cx,cx
mov dx,offset s
int 21h
jc er1

Полная ерунда, работать прога не могла. Должно быть примерно так:

Устанавливаем DMA.
mov ah,1ah
mov dx,30h ;сюда запишется имя найденого файла
int 21h

Ищем файл по маске:
mov ah,4eh ;поиск первого файла совпадающего с маской. делается только ОДИН раз, чтобы найти следующий нужно использовать 4fh
mov cx,7
mov dx,offset lub
int 21h

Открываем его:
mov ax,3d00h ; только для чтения
xor cx,cx
mov dx,30h+1eh ;здесь имя файла (без пути, т.е. в текущей директории)
int 21h
mov handler,ax ;сохраним "номер" окрытого файла, еще понадобится
jc er1

Прочитать файл:
mov bx,handler ;"номер" окрытого файла
mov ah,3fh
mov dx,offset s
mov cx,0ffh
int 21h
jc er3

дальше там печатем или что вы собирались делать с данными....

Ну и наконец закрываем файл:
mov bx,handler ;"номер" окрытого файла
mov ah,3eh
int 21h

Теперь ищем следующий файл:
mov ah,4fh ;поиск следующего файла совпадающего с маской
mov dx,30h ;маска больше не нужна нужна область "в которую искали" первый файл
int 21h
и если нашли - по кругу: окрываем-читаем-закрываем-ищем
Ответ отправил: Стас (статус: Специалист)
Ответ отправлен: 11.10.2006, 02:38

Отвечает: ENS
Здравствуйте, Whiteman!
Немного странно?Какой файл вы читаете. Надо сначало найти файл, открыть его,а уже потом прочитать.

---------
Если нет выхода ищу вход.
Ответ отправил: ENS (статус: 6-ой класс)
Ответ отправлен: 11.10.2006, 20:04


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

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

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

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

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала 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

В избранное