. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->寄存器(CPU工作原理)
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  关于第2版书第19页的疑问???  [待解决] 回复[ 16次 ]   点击[ 406次 ]  
xiaobatian
[帖 主]   [ 发表时间:2010-11-18 13:28 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-11-08 10:58
19页中间有这样两段话:

    在进行数据传送或运算时,要注意指令的两个操作对象的位数应当是一致的,例如:
①mov ax,bx
②mov bx,cx
③mov ax,18H
④mov al,18H
⑤add ax,bx
⑥add ax,20000
等都是正确的指令,而
⑦mov ax,bl                 (在8位寄存器和16位寄存器之间传送数据)
⑧mov bh,ax                 (在16位寄存器和8位寄存器之间传送数据)
⑨mov al,20000              (8位寄存器最大可存放值为255的数据)
⑩add al,100H               (将一个高于8位的数据加到一个8位寄存器中)
等都是错误的指令,错误的原因都是指令的两个操作对象的位数不一致.

先看上面一段里3和4,将3和4"合并"一下就可以写成mov ax,al(因为al和ax都为18H),这样是正确的?

再看下面一段里7说mov ax,bl是错误的???mov ax,al是正确的,mov ax,bl却是错误的?如果说位置一致性,上面那个也是错误的,第4句是不是错误的呢?
xiaobatian
[第1楼]   [ 回复时间:2010-11-18 13:50 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-11-08 10:58
如果有人回答我3和4不能那样"合并",那么第7句当bl=18H时,就是说mov ax,18H是错误的!同理,第4句也是错误的?
xiaobatian
[第2楼]   [ 回复时间:2010-11-18 13:51 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-11-08 10:58
如果有人回答我3和4不能那样"合并",那么第7句当bl=18H时,就是说mov ax,18H是错误的!同理,第4句也是错误的?
------------------
回复:上面应该是说同理,第3句也是错误的?
lhk3355
[第3楼]   [ 回复时间:2010-11-18 21:56 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-11-17 23:03
呵呵 那个不是同一句顺序下来的 只是一个赋值的例子  AX  代表寄存器  AH AL分别是前半段 和后半段 AX 以16存储   AH AL 是8位存储的 mov ax 18h 代表将16进制数18 存入AX  mov ah,18H代表 将18存入 AX寄存器的AH段中
xiaobatian
[第4楼]   [ 回复时间:2010-11-19 08:26 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-11-08 10:58
我知道那不是同一句顺序下来的,我上面写的"合并"都是带引号的,我只是综合思考~~~那我们单看第7句,当bl=18H的时候mov ax,bl是不是可以写成mov ax,18H?和上面正确的第3句是不是一样了?
guoqingshun123
[第5楼]   [ 回复时间:2010-11-19 19:15 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2010-11-18 22:02
哇,综合思考,问题本来好简单的,为什么看不懂问题究竟出在哪了?不知楼主云云,虽然自己的问题也还没发现.
①mov ax,bx 
②mov bx,cx 
③mov ax,18H 
④mov al,18H 
⑤add ax,bx 
⑥add ax,20000 {这些都没错阿}
将3和4"合并"一下就可以写成mov ax,al明显强加了个人主观方法,汇编器是不允许的,mov ax,bl寄存器之间传送要求位数一致,mov ax,18H中的18h和8位寄存器并不等同,不能这样合并,8位寄存器跟16位寄存器传送数据,16位寄存器就被当作8位寄存器了。汇编器会提示错误!!!就像语法你能根据自己的想法去改吗?如果是自己设计的汇编就可以自己定义。不要把自己的想法强加给计算机,现在是我们学习计算机语言,不是计算机来学我们的语言思想,那样就是我们被操控了。
lhk3355
[第6楼]   [ 回复时间:2010-11-19 21:14 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-11-17 23:03
我知道那不是同一句顺序下来的,我上面写的"合并"都是带引号的,我只是综合思考~~~那我们单看第7句,当bl=18H的时候mov ax,bl是不是可以写成mov ax,18H?和上面正确的第3句是不是一样了?
------------------
回复:

你可以写 ax,18h  但是 不可以ax,bl  bl是 8位二进制   AX是 16位 位数不同
xiaobatian
[第7楼]   [ 回复时间:2010-11-20 08:08 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-11-08 10:58
哇,综合思考,问题本来好简单的,为什么看不懂问题究竟出在哪了?不知楼主云云,虽然自己的问题也还没发现.
①mov ax,bx 
②mov bx,cx 
③mov ax,18H 
④mov al,18H 
⑤add ax,bx 
⑥add ax,20000 {这些都没错阿}
将3和4"合并"一下就可以写成mov ax,al明显强加了个人主观方法,汇编器是不允许的,mov ax,bl寄存器之间传送要求位数一致,mov ax,18H中的18h和8位寄存器并不等同,不能这样合并,8位寄存器跟16位寄存器传送数据,16位寄存器就被当作8位寄存器了。汇编器会提示错误!!!就像语法你能根据自己的想法去改吗?如果是自己设计的汇编就可以自己定义。不要把自己的想法强加给计算机,现在是我们学习计算机语言,不是计算机来学我们的语言思想,那样就是我们被操控了。
------------------
回复:这位兄台,能不能看一下我那个"合并"是带引号的?
xiaobatian
[第8楼]   [ 回复时间:2010-11-20 08:10 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-11-08 10:58
看一下当第7句bl=18H的时候mov ax,bl和第3句比较一下...
xohome
[第9楼]   [ 回复时间:2010-11-24 11:46 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:2
注册日期:2010-11-24 11:04
诶 说来说去问题就是为什么第③④句传入的值一样 这点确实比较迷惑人
MOV AX 18H   :AX为十六位,可以存4个十六进制,这里只有2个,其实默认的数据该为 MOV AX 0018H  
MOV AH 18H   :AH为八位  刚好 存入18H

"指令的两个操作对象的位数应当是一致的"  18H和0018H是相同的
lendo.du
[第10楼]   [ 回复时间:2010-11-24 16:00 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-03-26 16:07
不要自己迷惑自己,这个问题很简单的,楼主有点望文生意了。
mov ax 18h      ;ax是16位通用寄存器,可以存0000-FFFF范围的十六进制数,但是0018H照样合理。
mov ah 18h      ;ah是高8位通用寄存器,可以存00-FF范围的十六进制数,所以18H也合理。

而且立即数超过寄存器范围时在编译期是要出错的,但在运行期会自动忽略高位,楼主要合理看书。
xiaobatian
[第11楼]   [ 回复时间:2010-11-25 08:33 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-11-08 10:58
感谢大家的回答!

其实我的疑问不是3和4句,而是第7句!

我现在想想应该是这样的,第7句mov ax,bl,当bl为数值时比如为18H,mov ax,18H是正确的,就是说当向ax传送数值的时候是正确的,当用8位寄存器向16位寄存器传送(mov ax,bl)是错误的!

也就是说这个第7句,如果用寄存器传送位数必须一致!因为数值的可+0凑位特性,所以不能用数学的特殊值代入法来看这个问题!
englishnametk
[第12楼]   [ 回复时间:2010-11-28 11:07 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-11-21 23:12
8位不可以直接这么赋值给16位 除非你给的是立即数  确切的来说 mov ax,al 是错误的 不可以这么写。。。
dallas48
[第13楼]   [ 回复时间:2011-01-06 11:38 ]   [引用]   [回复]   [ top ] 
荣誉值:4
信誉值:2
注册日期:2011-01-06 10:33
cpu把ax与ah/al区分为两个不同的寄存器,再结合传输位数必须相同就不难理解了
ax:0000H
ah:00H
happychenbee
[第14楼]   [ 回复时间:2011-01-07 09:26 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-01-07 09:21
回复:[第11楼]
------------------
楼主,你的困惑在于把八位寄存器与八位常数混在一起了。八位常数18h电脑会自动高位补零,“凑”成十六位,以满足匹配要求;而八位寄存器是硬性规定,也就是硬件决定的,所以不可能与十六位匹配。不知道这样回答是否满意。
sssetset
[第15楼]   [ 回复时间:2011-01-07 10:00 ]   [引用]   [回复]   [ top ] 
荣誉值:4
信誉值:0
注册日期:2010-12-29 09:50
回复7楼
⑥add ax,20000 {这些都没错阿} 20000是十进制的,转换16进制应该为4e20H,所以是正确的,20000h这个才是16进制数。
hhxylijiajia
[第16楼]   [ 回复时间:2011-02-01 10:32 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2011-02-01 10:19
第3个 mov ax,18h  其中18h可以写成0018h。执行完这条指令后ax中的内容为0018h,其中ah中的数据为00h,al中的数据为18h
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved