我正在制作一个计算器类型的程序,我用它从用户那里获取一个数字并存储它:
mov ah, 01h
int 21h
mov offset num1, al
在代码的末尾,我将num1设置为具有的字节
num1 db 0
给它一个默认值0。
问题是,当我试图将数值从num1移回寄存器以执行实际操作时:
mov bl, offset num1
我收到一个错误,说第二个操作数超过8位,我无法通过任何互联网/手册搜索来弄清楚这一点。
此外,我使用偏移变量,因为这是我最初学习它们的方式,我并没有以任何其他方式真正理解它们。
这:
mov offset num1, al
应该是:
mov num1, al
和:
mov bl, offset num1
应该是:
mov bl, num1
offset
关键字应用于需要获取标签地址(确切地说,是标签在段内的偏移量)的情况。例如,如果使用INT 21H / AH=09H
打印字符串,则需要DX
来保持要打印的字符串的偏移量,因此可以使用mov dx, offset my_string
但在您展示的代码中,您只对在num1
中加载和存储值感兴趣,因此您应该简单地使用num1
(或[num1]
,在本文中,这与MASM/TASM语法中的num1
含义相同)。
关于错误消息的含义:实际模式程序中的偏移量是16位,因此即使您真的想将其移动到像al
或bl
这样的8位寄存器中,也无法做到这一点。