|
主题 : : 关于第2版书第19页的疑问??? [待解决] |
回复[ 16次 ]
点击[ 406次 ] | |
|
|
|
|
[帖 主]
[ 发表时间: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句是不是错误的呢? | | |
|
|
|
|
[第1楼]
[ 回复时间:2010-11-18 13:50 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-11-08 10:58 |
如果有人回答我3和4不能那样"合并",那么第7句当bl=18H时,就是说mov ax,18H是错误的!同理,第4句也是错误的? | | |
|
|
|
|
[第2楼]
[ 回复时间:2010-11-18 13:51 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-11-08 10:58 |
如果有人回答我3和4不能那样"合并",那么第7句当bl=18H时,就是说mov ax,18H是错误的!同理,第4句也是错误的?
------------------
回复:上面应该是说同理,第3句也是错误的? | | |
|
|
|
|
[第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段中 | | |
|
|
|
|
[第4楼]
[ 回复时间:2010-11-19 08:26 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-11-08 10:58 |
我知道那不是同一句顺序下来的,我上面写的"合并"都是带引号的,我只是综合思考~~~那我们单看第7句,当bl=18H的时候mov ax,bl是不是可以写成mov ax,18H?和上面正确的第3句是不是一样了? | | |
|
|
|
|
[第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位寄存器了。汇编器会提示错误!!!就像语法你能根据自己的想法去改吗?如果是自己设计的汇编就可以自己定义。不要把自己的想法强加给计算机,现在是我们学习计算机语言,不是计算机来学我们的语言思想,那样就是我们被操控了。 | | |
|
|
|
|
[第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位 位数不同 | | |
|
|
|
|
[第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位寄存器了。汇编器会提示错误!!!就像语法你能根据自己的想法去改吗?如果是自己设计的汇编就可以自己定义。不要把自己的想法强加给计算机,现在是我们学习计算机语言,不是计算机来学我们的语言思想,那样就是我们被操控了。
------------------
回复:这位兄台,能不能看一下我那个"合并"是带引号的? | | |
|
|
|
|
[第8楼]
[ 回复时间:2010-11-20 08:10 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-11-08 10:58 |
看一下当第7句bl=18H的时候mov ax,bl和第3句比较一下... | | |
|
|
|
|
[第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是相同的 | | |
|
|
|
|
[第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也合理。
而且立即数超过寄存器范围时在编译期是要出错的,但在运行期会自动忽略高位,楼主要合理看书。 | | |
|
|
|
|
[第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凑位特性,所以不能用数学的特殊值代入法来看这个问题! | | |
|
|
|
|
[第12楼]
[ 回复时间:2010-11-28 11:07 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-11-21 23:12 |
8位不可以直接这么赋值给16位 除非你给的是立即数 确切的来说 mov ax,al 是错误的 不可以这么写。。。 | | |
|
|
|
|
[第13楼]
[ 回复时间:2011-01-06 11:38 ]
[引用]
[回复]
[ top ] | |
荣誉值:4
信誉值:2
注册日期:2011-01-06 10:33 |
cpu把ax与ah/al区分为两个不同的寄存器,再结合传输位数必须相同就不难理解了
ax:0000H
ah:00H | | |
|
|
|
|
[第14楼]
[ 回复时间:2011-01-07 09:26 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-01-07 09:21 |
回复:[第11楼]
------------------
楼主,你的困惑在于把八位寄存器与八位常数混在一起了。八位常数18h电脑会自动高位补零,“凑”成十六位,以满足匹配要求;而八位寄存器是硬性规定,也就是硬件决定的,所以不可能与十六位匹配。不知道这样回答是否满意。 | | |
|
|
|
|
[第15楼]
[ 回复时间:2011-01-07 10:00 ]
[引用]
[回复]
[ top ] | |
荣誉值:4
信誉值:0
注册日期:2010-12-29 09:50 |
回复7楼
⑥add ax,20000 {这些都没错阿} 20000是十进制的,转换16进制应该为4e20H,所以是正确的,20000h这个才是16进制数。 | | |
|
|
|
|
[第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 | | |