微机原理在线等答案!

改错 1~PUSH AL
2~SHR DX,4
3~OUT 380H,AX
4~ADD AL,BX
5~POP CS
6MOV CL,3300H

恩,你好,呵呵
对于第五题,看楼下的也比较较真,我就仔细解释一下这个问题

在8086系统中对于段寄存器的操作是有很多限制的,能直接对段寄存器操作的只有MOV的少数传送指令,并且很不灵活
首先 立即数不能直接传递至数据段或者附加数据段寄存器中

其次 不能实现段寄存器之间的直接数据传送
如MOV DS, ES

第三 不能向CS代码段寄存器传送数据,IP不能在任何指令中出现
如MOV CS , AX
以及MOV AX,IP
这都是错误指令

所以,不是说MOV指令不能向段寄存器传送数据,比如向DS传送时肯定可以的,你基本上可以在所有汇编程序中看到MOV DS AX这条指令,但是绝对不能向CS传送指令。

为什么有上面我说的第三条,因为向CS和IP涉及到了整个系统的核心安全,CS是代码段,它和DS,ES在地位上有很大区别。如果可以更改CS或者IP,那么入侵就太容易了,我自己写一个破坏程序,然后我更改你的CS或者IP,让程序转到我的破坏程序处执行就可以了。之所以不允许向CS和IP传送数据就是出于安全考虑。

无论你在哪个地方,绝对看不到MOV CS xx这条指令

第一题
一个字节是8位,在16位机里面,一个字是16位,也就是2个字节,
PUSH是堆栈操作,意思是把一个字存到堆栈里面,堆栈操作是字操作,无论是压栈(也就是存)还是弹出(就是取)都必须是字,不能是字节,而AL是8位寄存器,也就是只能装一个字节,它是AX的低八位。
应该改为PUSH AX,这样就装的下了

第二题
SHR是右移操作,就是把一个数按位每一位都往右边移动,后面的操作数是移位位数,移位的位数要么是1,如果大于一就必须用CL表示,这条指令是想移动4位
所以应该先把4存到CL里面,改为
MOV CL 4
SHR DX CL

第三题
OUT指令就是把AL或者AX中的数据输出到外部设备寄存器中,它有两种格式,一种是:OUT 设备寄存器地址 AL或AX,另一种是: OUT DX AL或者AX。其中设备寄存器地址大于FFH时必须使用第二种格式,也就是先把设备寄存器地址存入DX中,380H显然大于FFH
所以这题应该改成
MOV DX 380H
OUT DX AX

第四题
ADD 指令的目的操作数和源操作数的类型必须要一致,要么都是字节要么都是字,这条指令中目的操作数类型是字节,源操作数类型是字,不一致,所以应该改为 ADD AX BX或者是ADD AL BL

第五题
CS是代码段寄存器,向代码段寄存器CS传送数据时非法的
所以不能用CS的
可以改成CX,那就是对的
楼上的写的也不对
POP不能向CS传数据,MOV也是不可以的
这题就不能用CS
楼下的回复还是错的
其他的段寄存器是可以的,但是CS绝对不行
在我们备课组的教案里面,MOV CS AX就是一个典型的错例

第六题
3300H化为二进制是16位的,也就是字,而CL只能容下一个字节也就是半个字(对16位机而言),也就是说CL装不下3300H,
改为 MOV CX 3300H

做完啦,呵呵,平安夜开心
温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-12-25
PUSH POP后必须是16位操作数
PUSH AX

SHR SHL SAR SAL移动一位可以直接SHR DX,1,移动多位就要用CL指定位数
MOV CL,4
SHR DX,CL

外设端口有2种寻址方法,直接寻址的话那么端口地址在00H~0FFH之间;寄存器寻址的话就是0000H~0FFFFH,地址必须放入DX/DL。你这个380H超过了FFH,就得用寄存器寻址方式,也就是端口地址与内存统一编址方式
MOV DX,380H
OUT DX,AX

ADD指令要求2个操作数字长一致
ADD AX,BX

POP指令不能对段寄存器操作
POP AX

MOV也一样要求字长一致
MOV CX,3300H

P.S. 楼下的,你说错了哦!MOV指令时不允许段寄存器之间的赋值,以及使用立即数给段寄存器赋值!
比如:MOV CS,DS 以及 MOV CS,O896H 都是错的
但是段寄存器是可以作为MOV的目的操作数的,不然你程序开始怎么设定段地址?不信你可以看看指令说明
PUSH POP使用段地址的确是非法的!

。。。果然,我错了。长见识了!回答改了!楼主也别搞错了!