Помощь - Поиск - Пользователи - Календарь
Полная версия: Пара вопросов
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Ассемблер
Client
Изучение ассемблере что-то не очень дается, поэтому появляется много вопросов, вот некоторые из них
1) Какого размера регистр и что в него можно положить (мы заносили туда даже строку, но не пойму как она туда помещается)?
2)как описать вещ число?
3)как сделать цикл в цикле (цикл ведь работает только с регистром cx?)?
Вот такие пока вопросы, кому не сложно ответьте пожалуйста
volvo
Цитата(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
Спасибо за ответ.
sseg segment
db 128 dup(?)
sseg ends
dseg segment
a db '*$'
i db 1 dup(?)

dseg ends
cseg segment
assume ss:sseg,ds:dseg,cs:cseg
start:
mov ax,dseg
mov ds,ax

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
Цитата
как его переделать для 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 ; <-- выполняем вышесказанное

end _start
прекрасно компилируется и собирается MASM-ом:
F:\test>D:\masm32\bin\ml.exe /c client_1.asm
F:\test>D:\masm32\bin\link16.exe client_1.obj
(только замени путь к MASM-у на свой, правильный)

Я надеюсь, на твой первый вопрос я комментариями ответил? А dup - это от duplicate (повторять), то есть ты здесь:
.data
arr db 20 dup(?)
выделишь не один байт, а 20. Поэтому я и убрал 1 dup, это смысла не имеет (повторять 1 раз? Лучше вообще не указывать количество повторов)...
Client
mov	al, 0 ; при AL = 0 заданное окно очищается _полностью_

Значит тут можно не указывать координаты начала/конца, т.к. все окно очистится?
Спасибо! good.gif
volvo
Цитата
Значит тут можно не указывать координаты начала/конца, т.к. все окно очистится?
Нет, ты не понял... Очистится полностью то окно, которое ты определил его координатами. А вот если в AH будет не 0, а 1 (например), то все строки в определенном тобой окне, а не вообще на экране, сдвинутся на одну вверх. Ведь функция 06h на самом деле - прокрутка текстового окна вверх, она только используется для очистки окна. С таким же успехом можно использовать mov ah, 07h, это - прокрутка окна вниз, но тебе-то какая разница, как будет очищаться экран, добавлением нужного количества строк снизу или сверху? smile.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.