1. Заголовок или название темы должно быть информативным 2. Все тексты программ должны помещаться в теги [CODE=asm] [/CODE] 3. Прежде чем задавать вопрос, см. "FAQ",если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно, такую задачу уже решали! 4. Не предлагайте свои решения на других языках, кроме Ассемблера. Исключение только с согласия модератора. 5. НЕ используйте форум для личного общения! Все, что не относиться к обсуждению темы - на PM! 6. Проверяйте программы перед тем, как выложить их на форум!!
Изучение ассемблере что-то не очень дается, поэтому появляется много вопросов, вот некоторые из них 1) Какого размера регистр и что в него можно положить (мы заносили туда даже строку, но не пойму как она туда помещается)? 2)как описать вещ число? 3)как сделать цикл в цикле (цикл ведь работает только с регистром cx?)? Вот такие пока вопросы, кому не сложно ответьте пожалуйста
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
.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 ; <-- выполняем вышесказанное
Значит тут можно не указывать координаты начала/конца, т.к. все окно очистится?
Нет, ты не понял... Очистится полностью то окно, которое ты определил его координатами. А вот если в AH будет не 0, а 1 (например), то все строки в определенном тобой окне, а не вообще на экране, сдвинутся на одну вверх. Ведь функция 06h на самом деле - прокрутка текстового окна вверх, она только используется для очистки окна. С таким же успехом можно использовать mov ah, 07h, это - прокрутка окна вниз, но тебе-то какая разница, как будет очищаться экран, добавлением нужного количества строк снизу или сверху?