找回密码
 立即注册
查看: 237|回复: 6

请教个问题:字类型的变量,不使用字寄存器,拆分成2个字节

[复制链接]
  • 打卡等级:常住居民III
  • 打卡总天数:172
  • 最近打卡:2025-05-01 10:06:01

44

主题

124

回帖

1437

积分

金牌会员

积分
1437
发表于 2025-1-17 17:12:51 | 显示全部楼层 |阅读模式

如何在不使用字寄存器(WR0 ~ WR14)的情况下,把字类型的变量拆分成2个字节?(用汇编语言)

这个字类型的变量可能定义在DATA段,也可能定义在XDATA段。

感谢先 :-)

回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:312
  • 最近打卡:2025-03-11 13:20:13

54

主题

1327

回帖

5395

积分

荣誉版主

积分
5395
发表于 2025-1-18 13:27:16 | 显示全部楼层
?DT?ADD64?START_1   EQU  $
?ADD64?BYTE    EQU  $
                   ORG  ?DT?ADD64?START_1 + 0
?ADD64_value1?040:    DSD  1                // 被加数/被减数/被乘数/被除数(高位双字),作临时变量用
?ADD64_value2?041:    DSD  1                // 被加数/被减数/被乘数/被除数(低位双字),作临时变量用
?ADD64_value3?042:    DSD  1                // 加数/减数/乘数/除数(高位双字)
?ADD64_value4?043:    DSD  1                // 加数/减数/乘数/除数(低位双字)
?ADD64_pointer?044:   DSD  1                // 计算结果回传指针

注:  DSD, 保留 4字节;  DSW, 保留 2字节;  DSB, 保留 1字节;  
      ?DT? , DATA;   ?ED? , EDATA;   ?XD? , XDATA;   

分段命名约定-前缀.JPG



回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:312
  • 最近打卡:2025-03-11 13:20:13

54

主题

1327

回帖

5395

积分

荣誉版主

积分
5395
发表于 2025-1-18 13:38:06 | 显示全部楼层
如定义 ?ADD64_value1?040:    DSD  1      // 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
其他依次类推.
回复 支持 1 反对 0

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:172
  • 最近打卡:2025-05-01 10:06:01

44

主题

124

回帖

1437

积分

金牌会员

积分
1437
发表于 2025-1-18 20:01:56 | 显示全部楼层

您好,是不是尽管变量被定义为非字节类型的,但是访问的时候按变量名作为它在存储中的首地址,地址每加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被定义为字类型(双字节的),但通过上述方式,成功地访问了被定义为字类型的变量的各个字节?

简单地调试了一次,的确每次修改/访问的都是字节地址。

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:172
  • 最近打卡:2025-05-01 10:06:01

44

主题

124

回帖

1437

积分

金牌会员

积分
1437
发表于 2025-1-18 21:45:45 | 显示全部楼层
LAO*** 发表于 2025-1-18 13:38
如定义 ?ADD64_value1?040:    DSD  1      // 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被定义为字类型(双字节的),但通过上述方式,成功地访问了被定义为字类型的变量的各个字节?

简单地调试了一次,的确每次修改/访问的都是字节地址。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:312
  • 最近打卡:2025-03-11 13:20:13

54

主题

1327

回帖

5395

积分

荣誉版主

积分
5395
发表于 2025-1-19 03:46:25 | 显示全部楼层
汇编没有 C 语言的 字类型 之说.
仅能用符号 伪定义 实际地址(类拟 C的宏, 替换法).
而 DS 类指令, 也只是保留 地址 空间.
比如  DSB  4;   和 DSD   1;  功能及用途相同, 只是为了程序中更直观的区别
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:312
  • 最近打卡:2025-03-11 13:20:13

54

主题

1327

回帖

5395

积分

荣誉版主

积分
5395
发表于 2025-1-19 03:49:28 | 显示全部楼层
所以这样的理解也可
访问的时候按变量名(强制转换为BYTE类型), 它在存储中的首地址,地址每加1,就会指向这个定义BYTE类型的变量的下一个字节
回复 支持 1 反对 0

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 08:48 , Processed in 0.141354 second(s), 89 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表