在程序集中以 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);
我想编写一个程序,从用户那里获取 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);