请教个问题:字类型的变量,不使用字寄存器,拆分成2个字节
<p>如何在不使用字寄存器(WR0 ~ WR14)的情况下,把字类型的变量拆分成2个字节?(用汇编语言)</p><p>这个字类型的变量可能定义在<strong>DATA</strong>段,也可能定义在<strong>XDATA</strong>段。</p>
<p>感谢先 :-)</p>
?DT?ADD64?START_1 EQU$
?ADD64?BYTE EQU$
ORG?DT?ADD64?START_1 + 0
?ADD64_value1?040: DSD1 // 被加数/被减数/被乘数/被除数(高位双字),作临时变量用
?ADD64_value2?041: DSD1 // 被加数/被减数/被乘数/被除数(低位双字),作临时变量用
?ADD64_value3?042: DSD1 // 加数/减数/乘数/除数(高位双字)
?ADD64_value4?043: DSD1 // 加数/减数/乘数/除数(低位双字)
?ADD64_pointer?044: DSD1 // 计算结果回传指针
注:DSD, 保留 4字节;DSW, 保留 2字节;DSB, 保留 1字节;
?DT? , DATA; ?ED? , EDATA; ?XD? , XDATA;
如定义 ?ADD64_value1?040: DSD1 // 4字节(双字)
最高 BYTE 为: ?ADD64_value1?040
次高 BYTE 为: ?ADD64_value1?040+1
中间 BYTE 为: ?ADD64_value1?040+2
最低 BYTE 为: ?ADD64_value1?040+3
//=======================
高 WPRD 为: ?ADD64_value1?040
佩 WORD 为: ?ADD64_value1?040+2
其他依次类推. <p>您好,是不是尽管变量被定义为非字节类型的,但是访问的时候按变量名作为它在存储中的首地址,地址每加1,就会指向这个定义为非字节类型的变量的下一个字节?</p>
<p>就像这样:</p>
<p><code>DSEG AT 30H</code></p>
<p><code>COLOR: DSW 1D</code></p>
<p>`MOV WR30, #1122H<br />
MOV COLOR, WR30</p>
<pre><code>NOP
NOP
PUSH COLOR
PUSH COLOR + 1D
MOV WR30, #7788H
MOV COLOR, WR30
POP COLOR + 1D
POP COLOR`
</code></pre>
<p>尽管变量COLOR被定义为字类型(双字节的),但通过上述方式,成功地访问了被定义为字类型的变量的各个字节?</p>
<p>简单地调试了一次,的确每次修改/访问的都是字节地址。</p>
LAOXU 发表于 2025-1-18 13:38
如定义 ?ADD64_value1?040: DSD1 // 4字节(双字)
最高 BYTE 为: ?ADD64_value1?040
...
不知道上面的帖子怎么回事,变成了回复我自己。不好意思 :-)
您好,是不是尽管变量被定义为非字节类型的,但是访问的时候按变量名作为它在存储中的首地址,地址每加1,就会指向这个定义为非字节类型的变量的下一个字节?
就像这样:
DSEG AT 30H
COLOR: DSW 1D
`MOV WR30, #1122H
MOV COLOR, WR30
NOP
NOP
PUSH COLOR
PUSH COLOR + 1D
MOV WR30, #7788H
MOV COLOR, WR30
POP COLOR + 1D
POP COLOR`
尽管变量COLOR被定义为字类型(双字节的),但通过上述方式,成功地访问了被定义为字类型的变量的各个字节?
简单地调试了一次,的确每次修改/访问的都是字节地址。 汇编没有 C 语言的 字类型 之说.
仅能用符号 伪定义 实际地址(类拟 C的宏, 替换法).
而 DS 类指令, 也只是保留 地址 空间.
比如DSB4; 和 DSD 1;功能及用途相同, 只是为了程序中更直观的区别 所以这样的理解也可
访问的时候按变量名(强制转换为BYTE类型), 它在存储中的首地址,地址每加1,就会指向这个定义BYTE类型的变量的下一个字节
页:
[1]