gpt4 book ai didi

assembly - 将值保存在程序集中 var 的字节中

转载 作者:行者123 更新时间:2023-12-02 19:04:51 25 4
gpt4 key购买 nike

我想制作一个程序,从用户那里获取 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 也不需要静态存储。这是一个汇编时间常量,您选择将其硬编码为 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);

关于assembly - 将值保存在程序集中 var 的字节中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54973019/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com