assembly - 在汇编中保存 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
解决方案
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);
推荐阅读
- r - 将数据帧中每一行的向量分成两半
- javascript - 如何通过 Chrome 扩展程序实时使用 Google Docs?
- c# - 从列表框 1 中查找偶数并显示在列表框 2 中,同时在列表框 3 中显示奇数
- javascript - 是什么导致 chrome 和 firefox 上的 UI 转换偶尔出现打嗝?
- css - 为 bootstrap4 增加引导工具提示弹出框的字体大小
- django-templates - 为什么 django 不接 elif
- reactjs - 反应本机自定义导航栏问题
- angularjs - Ctrl+space 不适用于 Eclipse 2021-06 中的 AngularJS 内容辅助
- python - 如何将我的第一个节点的 prev 设置为我的最后一个节点的下一个以创建循环双向链表?
- ruby - Net::HTTP.get 失败,带有标头的 HTTPS