Вопрос № 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)
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