Изучение ассемблере что-то не очень дается, поэтому появляется много вопросов, вот некоторые из них 1) Какого размера регистр и что в него можно положить (мы заносили туда даже строку, но не пойму как она туда помещается)? 2)как описать вещ число? 3)как сделать цикл в цикле (цикл ведь работает только с регистром cx?)? Вот такие пока вопросы, кому не сложно ответьте пожалуйста
volvo
28.03.2009 19:46
Цитата(Client @ 28.03.2009 14:05)
1) Какого размера регистр и что в него можно положить (мы заносили туда даже строку, но не пойму как она туда помещается)?
Размер регистров eax, ebx, ecx ... = 32 бита (двойное слово), регистров ax, bx, cx, ... (это младшие части расширенных регистров) = соответственно 16 бит (слово)... А заносили вы в регистр - не строку, а ее адрес (т.е., смещение относительно начала сегмента, в котором находится строка).
Цитата(Client @ 28.03.2009 14:05)
2)как описать вещ число?
.data X dd 1.5 Y dd 2.7
Вот тебе уже 2 вещественных числа одинарной точности... DD (4 байта) - одинарная точность, DQ (8 байт) - двойная точность, DT (10 байт) - расширенная точность...
Цитата(Client @ 28.03.2009 14:05)
3)как сделать цикл в цикле (цикл ведь работает только с регистром cx?)?
Никто ж не запрещает тебе сохранять счетчик внешнего цикла, правда? Т.е.,
outer: mov cx, 10 ; внешний цикл push cx
inner: mov cx, 5 ; внутренний цикл ; ... делаешь то, что нужно loop inner
pop cx loop outer
Client
1.04.2009 10:47
Спасибо за ответ.
sseg segment db 128 dup(?) sseg ends dseg segment a db '*$' i db 1 dup(?)
mov ah,6h ;очистка экрана mov al,0 ; тут что происходит? mov ch,0 ; строка mov cl,0 ; столбец mov dh,24 ;строка mov dl,79 ;столбец mov bh,02h ;цвет int 10h ; это все очистка
mov dl,a mov cx,5 mov ah,2h mov bh,0h mov dh,1 ; переход на строку mov dl,2 ; переход на столбец int 10h
m1: mov ah,2h int 21h loop m1 mov ah,4ch int 21h mov cx,7 mov i,2 m2:
cseg ends end start
При прерывании (int) всегда в ah надо что-то ложить? И что такое dup(?) Код (еще не до конца написан) написан для TASM, как его переделать для MASM?
volvo
1.04.2009 12:53
Цитата
как его переделать для MASM?
Вот это (файл client_1.asm)
.model small .stack .data a db '*$' ;i db ? .code _start: mov ah, 6h ; очистка окна mov al, 0 ; при AL = 0 заданное окно очищается _полностью_ mov ch, 0 ; строка - начало окна mov cl, 0 ; столбец - начало окна mov dh, 24 ; строка - конец окна mov dl, 79 ; столбец - конец окна mov bh, 02h ; цвет
; вызываем, собственно, прерывание, которое выполнит функцию ; с номером, хранящимся в AH (в твоем случае это очистка экрана) int 10h
mov ah, 2h ; функция 02 - изменить положение курсора mov bh, 0h mov dh, 1 ; переход на строку mov dl, 2 ; переход на столбец int 10h ; теперь выполнится ф-я 02 прерывания 10H
mov ax, SEG a ; заносим в AX сегментную часть адреса строки mov ds, ax ; и копируем ее в DS (напрямую занести "SEG a" в DS тебе не позволят) mov dx, OFFSET a ; в DX - заносим вторую часть адреса строки: смещение
; таким образом, после всего сделанного полный адрес строки хранится в DS:DX ; что нам и нужно для вывода на экран mov ah, 09h ; функция вывода на экран int 21h ; вызываем в-ю 09h
mov ax, 4c00h ; завершение работы программы и выход int 21h ; <-- выполняем вышесказанное
Я надеюсь, на твой первый вопрос я комментариями ответил? А dup - это от duplicate (повторять), то есть ты здесь:
.data arr db 20 dup(?)
выделишь не один байт, а 20. Поэтому я и убрал 1 dup, это смысла не имеет (повторять 1 раз? Лучше вообще не указывать количество повторов)...
Client
1.04.2009 13:10
mov al, 0 ; при AL = 0 заданное окно очищается _полностью_
Значит тут можно не указывать координаты начала/конца, т.к. все окно очистится? Спасибо!
volvo
1.04.2009 13:32
Цитата
Значит тут можно не указывать координаты начала/конца, т.к. все окно очистится?
Нет, ты не понял... Очистится полностью то окно, которое ты определил его координатами. А вот если в AH будет не 0, а 1 (например), то все строки в определенном тобой окне, а не вообще на экране, сдвинутся на одну вверх. Ведь функция 06h на самом деле - прокрутка текстового окна вверх, она только используется для очистки окна. С таким же успехом можно использовать mov ah, 07h, это - прокрутка окна вниз, но тебе-то какая разница, как будет очищаться экран, добавлением нужного количества строк снизу или сверху?
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.