x86 не имеет режимов адресации с косвенной памятью, которые могут загружать индекс из памяти.Храните свой индекс в регистре, как обычный человек, для этого нужны регистры.
Или используйте приращение указателя и сравните его с указателем конца.
Вам не нужно статическое хранилище дляcont
либо.Это константа времени сборки, которую вы выбрали для жесткого кодирования как 10h
, то есть 16, что больше, чем количество места, которое вы зарезервировали для DATA ... Так что это просто ошибка, которая исчезнет, если мы просто введемметка после DATA или позволить ассемблеру вычислить его размер.
Сравнение регистра с меткой использует адрес как непосредственный, без загрузки значения из памяти.
.model small
.stack 100h
.data
DATA db 10 dup(?)
DATA_END:
data_size = $ - DATA ; or if you want the size in bytes, you can do this
msg db 10,13,7, 'Input: ', '$'
.code
mov ax, @data
mov ds, ax
mov es, ax
mov ah, 09h
mov dx, OFFSET msg ; There's no reason to use LEA for putting static addresses into registers, except with x86-64 RIP-relative addressing. MOV is shorter and more efficient.
int 21h
mov di, OFFSET DATA
mov ah, 01h ; we can hoist this out of the loop because we don't destroy AH
cicle: ; do {
int 21h
mov [di], al ;Save ASCII char into DATA
inc di
cmp di, OFFSET DATA_END
jb cicle ; }while(p < end_pointer);