Сохранить значение в байте переменной в сборке - PullRequest
0 голосов
/ 03 марта 2019

Я хочу создать программу, которая берет от пользователя 10 символов и сохраняет их в векторе ДАННЫЕ , но я получаю ошибку

не могу добавить относительные величины

в mov byte ptr DATA[pos], al при попытке сохранить значение.
Как устранить эту ошибку?

 .model small
 .stack 100h
 .data
   DATA db 10 dup(?)
   cont db 010h
   pos db 0h
   msg db 10,13,7, 'Input: ', '$'

.code
 mov ax, @data
 mov ds, ax
 mov es, ax

mov ah, 09h
lea dx, msg
int 21h

cicle:  
  mov ah, 01h
  int 21h

  mov byte ptr DATA[pos], al   ;Save ASCII char in position pos in DATA

  inc pos
  dec cont 
jnz cicle

1 Ответ

0 голосов
/ 04 марта 2019

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);
...