在程序集中以 var 的字节保存值

Save value in byte of var in assembly

我想编写一个程序,从用户那里获取 10 个字符并将它们保存在一个向量中 DATA,但是我得到了错误

can't add relative quantities

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

x86 没有可以从内存加载索引的内存间接寻址模式。像普通人一样把你的索引保存在寄存器中,这就是寄存器的作用。

或者使用指针增量并与结束指针进行比较。

您也不需要 cont 的静态存储。这是一个 assemble 时间常数,您选择将其硬编码为 10h,即 16,它大于您为 DATA 保留的 space 的数量...所以这就是如果我们简单地在 DATA 之后放置一个标签,或者让 assembler 计算它的大小,这只是一个错误。

将寄存器与标签进行比较使用 地址 作为立即数,而不是从内存中加载值。

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