Вопрос № 93004: Добрый день! Я уже столько раз это перечитываю, в отладчике смотрю... но эти строки никак понять не могу:
....
mov si,100h ;DS:SI откуда перемещать будем
rep movsb ;перебрасываем нашу программу в область
;7 видеостраницы<br...Вопрос № 93020: Здравствуйте!
Возможно, мой вопрос не покажется вам заслуживающим внимания, но тем не менее я не могу до конца разобраться с командой test и прошу вашей помощи.
test операнд_1,операнд_2 — операция проверки (способом логического умноже-
н...Вопрос № 93091: Добрый день!
Я учу Ассемблер по рассылке "Ассемблер? Это просто! Учимся программировать" и никак не могу понять, почему Check_video proc главы 11 так сильно отличается от Check_video proc главы 14.
Check_video proc
mov ah,...
Вопрос № 93.004
Добрый день! Я уже столько раз это перечитываю, в отладчике смотрю... но эти строки никак понять не могу:
....
mov si,100h ;DS:SI откуда перемещать будем
rep movsb ;перебрасываем нашу программу в область
;7 видеостраницы
; !!! Теперь ВНИМАТЕЛЬНО следим за CS в отладчике !!!
; ___________________________________________________
jmp dword ptr cs:[Off_move] ;Прыгаем куда переместили (фактически на
;следующую строку, только уже в сегменте
;0BF00h!)
; Что показал отладчик? Подумайте, что произошло...
; Теперь мы уже в области экрана
Lab_jmp:
;Вот сюда-то мы и прыгнули с предыдущей строки! Толко CS теперь
;равен 0BF00h. Внимательно проследите в отладчике за этим...
....
НУ почему полсле jmp'а cs поменялся?..((
Ну в нем было то же, что и в ss и тут резко он меняется....
Если не сложно, помогите мне, пожалуйста...
Спасибо! Удачи! Всего наилучшего!
Отвечает: Зенченко Константин Николаевич
Здравствуйте, Покритюк Виталий Леонидович!
Причина в этой команде jmp dword ptr cs:[Off_move]
для перехода используется 4-е байта т.е. 2-а байта в IP и 2-а байта в CS, длинный переход в другой сегмент,
и этих переменных: Off_move dw offset Lab_jmp;Смещение и Seg_move dw 0BF00h;сегмент адреса, куда будем прыгать
итого в IP будет адрес метки Lab_jmp, а в CS будет 0BF00h. Это Вам показывает отладчик.
Удачи!
--------- И только наступив на грабли мы преобретаем драгоценный опыт!
Ответ отправил: Зенченко Константин Николаевич (статус: Практикант)
Ответ отправлен: 26.06.2007, 22:05 Оценка за ответ: 3 Комментарий оценки: Спасибо огромное за такие быстрые ответы!!!
Вопрос № 93.020
Здравствуйте!
Возможно, мой вопрос не покажется вам заслуживающим внимания, но тем не менее я не могу до конца разобраться с командой test и прошу вашей помощи.
test операнд_1,операнд_2 — операция проверки (способом логического умноже-
ния). Команда выполняет поразрядно логическую операцию Я над битами опе-
рандов операнд_1 и операнд_2. Состояние операндов остается прежним, изме-
няются только флаги ZF, SF, и PF, что дает возможность анализировать состояние
отдельных битов операнда без изменения их состояния в исходных операндах
Во многих источниках рассматривается команда test EAX, EAX, как определитель нуля в данном регистре ("... а не ноль ли в EAX"). Правильно ли я понимаю, что данная команда сработает только при наличии нуля в EAX, при любых других значениях этого не произойдёт. Какой смысл сравнивать содержимое регистра само с собой, если результат будет только при нулевом значени регистра? (Я не подвергаю это сомнению, я прошу объяснить смысл).
Заранее прошу прощения за возможно глупую интерпретацию данного вопроса, но если бы я это поннимал, то наверняка такой вопрос не задал бы. Ведь я только начинаю изучать Assembler.
Спасибо всем, кто откликнется
Отправлен: 27.06.2007, 00:28
Вопрос задал: Federal (статус: 1-ый класс)
Всего ответов: 1 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: Олег Владимирович
Здравствуйте, Federal!
Действительно, странная формулировка "сработает только при...". Сработает-то она всегда, процессор ничего против test не имеет. :)
Если мы имеем своей целью различить случаи EAX == 0 и EAX != 0, то test eax, eax поможет - ведь при eax == 0 она устанавливает zf = 1, при eax != 0 zf = 0. Если же нужно проверить, EAX == 24 или EAX != 24, то test тут, конечно, не подходит. Здесь нужна простая универсальная CMP EAX, 24. Почему же cmp eax, 0 обычно не применяют в случае проверки на ноль? Можно и её, но просто test eax, eax короче - всего два байта. :)
Далее, если нам надо проверить, установлен ли нулевой бит в EAX, применяется test eax, 1, после чего опять-таки смотрят на ZF: ZF = 0 при установленном в 1 бите, ZF = 1 при сброшенном в 0. Догадайтесь, что делает test eax, 0FFFFFFFFh? Правильно, проверяет, установлен ли хоть один бит в EAX, т.е., в сущности, не ноль ли в аккумуляторе. Но эта команда опять-таки длиннее test eax, eax.
Ну и напоследок. Многие команды (add, sub, cmp, and, or, xor, adc, sbb, xadd, inc, dec, shl, shr, sar, ...) устанавливают флаги в соответствии с полученным результатом. По ним потом удобно судить о результате - 0 он (ZF), имеет ли знак(SF), и т.п. Но если никаких действий не производилось, например, команда mov eax, [edi] флагов не устанавливает, а хотелось бы, то делают холостую операцию только ради установки флагов в соответствии с результатом. Если хочется установить флаги в соответствии с состоянием eax,
нужно придумать операцию, результатом которой будет eax. Например, test eax, eax, или or eax, 0. Они ничего, кроме флагов, не меняют, значение в регистре они не портят, но об этом значении мы можем что-то выяснить по флагам.
Если есть ещё вопросы, или если я не так что-то понял - обращайтесь в минифорум, проодлжим.
Удачи!
--------- Факультет ПМ-ПУ - лучший в СПбГУ!
Ответ отправил: Олег Владимирович (статус: Студент)
Ответ отправлен: 27.06.2007, 01:23 Оценка за ответ: 5
Вопрос № 93.091
Добрый день!
Я учу Ассемблер по рассылке "Ассемблер? Это просто! Учимся программировать" и никак не могу понять, почему Check_video proc главы 11 так сильно отличается от Check_video proc главы 14.
Check_video proc
mov ah,0Fh
int 10h
cmp al,3 ;Текущий режим монитора текстовый?
je Ok_video
mov ax,3 ;Если нет - делаем текстовый
int 10h
Ok_video:
cmp bh,0 ;Нулевая страница?
jz Ok_page
mov ax,0500h ;Если нет - делаем нулевую текущей
int 10h
Ok_page:
ret
Check_video endp
Check_video proc
mov ah,0Fh
int 10h
cmp al,3 ;Текстовый режим?
je Ok_video
mov ax,3 ;Если нет - делаем текстовый
int 10h
Ok_video:
or bh,bh ;Нулевая страница?
jz Ok_page
mov ax,0500h ;Если нет - делаем нулевую текущей
int 10h
Ok_page:
ret
Check_video endp
1. Почему в 11 главе cmp bh,0, а в 14 уже or bh,bh ?
2. А почему 0-ая страница 0500h, а не 0B800h
Отвечает: Зенченко Константин Николаевич
Здравствуйте, Покритюк Виталий Леонидович!
1) Команды cmp bh,00h и or bh,bh делают одно и тоже, а именно устанавливают флаг ZF, в первом случае содержимое регистра сравнивается с числом, при равенстве ZF=1, во втором случае регистр проверяется сам с собой, при bh=00h флаг ZF=1.
Вместо or bh,bh можно использовать команду and bh,bh, при проверке на ноль они делают одно и тоже
2)
mov ax,0500h- это AH=05h фунцция прерывания 10h BIOS, устанавливает видео страницу, номер которой указан в AL=00h.
0B800h-это сегментный адрес видеобуфера, обычно он используется при прямой записи в видеобуфер.
mov bx,0B00h
mov ex,bx
mov cx,50
xor di,di
mov ax,1401h;синий фон красная мордочка
cld
rep stosw
на экране появятся 50 мордочек
Удачи!
--------- И только наступив на грабли мы преобретаем драгоценный опыт!
Ответ отправил: Зенченко Константин Николаевич (статус: Практикант)
Ответ отправлен: 27.06.2007, 16:31 Оценка за ответ: 5 Комментарий оценки: Огромное спасибо! Удачи!