【问题标题】:Save value in byte of var in assembly在汇编中保存 var 字节中的值
【发布时间】:2019-07-25 03:53:25
【问题描述】:

我想制作一个程序,从用户那里获取 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

【问题讨论】:

  • DATA[pos] 并不像您认为的那样。它的实际含义是[address of DATA + address of pos]。你似乎想要类似mov bx,pos, move byte ptr [DATA+bx],al
  • movzx bx,byte ptr pos代替mov bx,pos,因为pos是一个字节。

标签: assembly x86-16 tasm


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-03
    • 2013-04-28
    • 2012-12-14
    • 1970-01-01
    相关资源
    最近更新 更多