首页 > 解决方案 > 在汇编中保存 var 字节中的值

问题描述

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

不能添加相对数量

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

标签: assemblyx86-16tasm

解决方案


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

推荐阅读