鱼C论坛

 找回密码
 立即注册
查看: 2857|回复: 12

是关于16位能否与8位相加的问题

[复制链接]
发表于 2013-10-2 13:44:28 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
今天看着视频,好纠结啊,这里不懂 捕获.PNG

因此我分别在debug和编辑器里试了一下


debug:
1.PNG

2.PNG

可以add啊

在编辑器写也是可以的


那为什么老师说不可以呢

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-10-2 14:17:58 | 显示全部楼层
本帖最后由 LinuxDeepin 于 2013-10-2 14:20 编辑

你确定你相加的数值8位的吗?
add ax,[bx]
由于ax寄存器是十六位的,那么ds:[bx]所指向的内存单元数据也是十六位的
例如:

ds:0000  01 42 00 00 00 00 00 00 00 00 00 00 00 00 00 00

此时 add ax,[bx]
那么 相当于 ax 加 4201H
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-10-2 14:36:37 | 显示全部楼层

一个内存单元不是8位的吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-10-2 14:37:52 | 显示全部楼层
LinuxDeepin 发表于 2013-10-2 14:17
你确定你相加的数值8位的吗?
add ax,
由于ax寄存器是十六位的,那么ds:所指向的内存单元数据也是十六位的 ...

还有,小甲鱼的程序也是这么写的:mov al,[bx]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-10-2 14:47:47 | 显示全部楼层
Sen哥 发表于 2013-10-2 14:36
一个内存单元不是8位的吗

一个内存单元是一个字节,八位

但 ax 寄存器是十六位寄存器,add ax,[bx] 会自动拉上高位字节补充的。
也就是 会拉多一个字节,两个字节组成十六位
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-10-2 14:49:41 | 显示全部楼层
Sen哥 发表于 2013-10-2 14:37
还有,小甲鱼的程序也是这么写的:mov al,

ax 寄存器是十六位的,但是为了程序兼容性。
可以分为两个八位的寄存器,分别是 ah 高八位寄存器,al 低八位寄存器

mov al,[bx] 由于al 是低八位寄存器,八位为一个字节,那么就只会读取一个字节
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-10-2 15:53:58 | 显示全部楼层
LinuxDeepin 发表于 2013-10-2 14:49
ax 寄存器是十六位的,但是为了程序兼容性。
可以分为两个八位的寄存器,分别是 ah 高八位寄存器,al 低 ...

en  ,那16位+8位会有什么后果呢,我试的时候好想没什么影响
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-10-2 16:05:56 | 显示全部楼层
本帖最后由 LinuxDeepin 于 2013-10-2 16:07 编辑
Sen哥 发表于 2013-10-2 15:53
en  ,那16位+8位会有什么后果呢,我试的时候好想没什么影响

例子:
add ax,ds:[0]
假设,ax 为 1111,ds:[0]
你理想中的ds:[0] 所指向的内存单元字节数值为 : 11
而内存单元中存储的数据如下:
ds:0000    11 00 11 00 00 44 44 44 22 22 E6 EA 00 00 00 00
那么此时的运算结果如下:
1111H+0011H=1122H
答案是正确的。

如果内存单元存储数据如下:
ds:0000    11 AC 11 00 00 44 44 44 22 22 E6 EA 00 00 00 00
那么此时的运算结果如下:
1111H+AC11H=BD22H
结果就不是你所想要的了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-10-2 18:18:43 | 显示全部楼层
LinuxDeepin 发表于 2013-10-2 16:05
例子:
add ax,ds:[0]
假设,ax 为 1111,ds:[0]

谢谢你,那ds:[0]指向的不是以字节为单位的吗??ds:[0]不是只会等于11吗??
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-10-2 18:50:54 | 显示全部楼层
你在多看看吧。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-10-2 19:47:51 | 显示全部楼层
Sen哥 发表于 2013-10-2 18:18
谢谢你,那ds:[0]指向的不是以字节为单位的吗??ds:[0]不是只会等于11吗??

ds:[0] 并不是决定单位的要素
ax 才是决定单位的要素,ax 是十六位的,那么ds:[0] 就是以字为单位的
al 是八位寄存器,那么 ds:[0] 就是以字节为单位的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-10-2 23:41:33 | 显示全部楼层
不可以的,想想也知道啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-10-3 05:17:07 | 显示全部楼层
呵呵,慢慢来,,多思考。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-17 09:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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