Изучение ассемблере что-то не очень дается, поэтому появляется много вопросов, вот некоторые из них
1) Какого размера регистр и что в него можно положить (мы заносили туда даже строку, но не пойму как она туда помещается)?
2)как описать вещ число?
3)как сделать цикл в цикле (цикл ведь работает только с регистром cx?)?
Вот такие пока вопросы, кому не сложно ответьте пожалуйста
.dataВот тебе уже 2 вещественных числа одинарной точности... DD (4 байта) - одинарная точность, DQ (8 байт) - двойная точность, DT (10 байт) - расширенная точность...
X dd 1.5
Y dd 2.7
outer:
mov cx, 10 ; внешний цикл
push cx
inner:
mov cx, 5 ; внутренний цикл
; ... делаешь то, что нужно
loop inner
pop cx
loop outer
Спасибо за ответ.
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
.model smallпрекрасно компилируется и собирается MASM-ом:
.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
F:\test>D:\masm32\bin\ml.exe /c client_1.asm
F:\test>D:\masm32\bin\link16.exe client_1.obj
.dataвыделишь не один байт, а 20. Поэтому я и убрал 1 dup, это смысла не имеет (повторять 1 раз? Лучше вообще не указывать количество повторов)...
arr db 20 dup(?)
mov al, 0 ; при AL = 0 заданное окно очищается _полностью_Значит тут можно не указывать координаты начала/конца, т.к. все окно очистится?