回 帖 发 新 帖 刷新版面

主题:[讨论]请教一道习题???

指出下列各小题中指令的错误??
有一段定义是这样的:
DATA_S  SEGMENT
NUM=56
BYTEX  DB  NUM
BYTEY  DB  27
WORDZ  DW  148
DATA_S  ENDS

1、ADD  BYTEY,BYTEX
2、ADD  AL,WORDZ
3、SUB  BL,047BH
4、ADD  [BX],[DI]
5、MOV  DS,DATA_S
6、POP  CS
7、PUSH  25
8、MOV  ES,DS
9、MOV  CS,AX
10、MOV  NUM,AX
11、MOV  AX,[SI+DI]
12、MOV  AX,[CX]
13、MOV  AX,IP
14、MOV  [SI],123
就是这些小题,有的我知道答案,可是有的不太明白,可能是基本概念不是很清楚,想请高手指教一下,最好详细一些,因为一些小问题,可能会有很大的影响!!谢谢!!!!

回复列表 (共3个回复)

沙发

1 BYTEY和BYTEX是存放数据段的地址,他们之间不能进行加法运算,必须传给寄存器然后再进行加法,例如MOV AX,BYTEY  MOV BX,BYTEX  AND AX,BX
2 类型不匹配,AL为字节,WORDZ为字
3 类型不匹配,BL为字节,047BH为字
4 [BX],[DI]为内存单元操作数,书中规定内存单元不能进行加减运算
5 段地址不能直接赋值给段寄存器,应该这样改MOV AX,DATA_S  MOV DS,AX
6 POP指令好象不能弹出到CS,因为你程序的执行是按照代码段的语句执行的,你现在等于把代码段的段基址更改了会引起中断的,我是这么理解的你可以看看书
7 PUSH是压入指令,我觉得应该是把寄存器的内容压入堆栈,所以我认为应该把立即数先赋值给寄存器,然后把寄存器的内容压入堆栈
8 段寄存器之间不能用传送指令,应先把他们分别赋值给寄存器然后用MOV指令
9 我觉得应该是和6差不多的问题,这样会改变代码段的基址,引起中断吧
10 这个是类型不匹配的问题,在你数据段定义的时候你已经定义了NUM是字节的,而现在的AX是字类型的
11 未指明[SI+DI]所指的单元是什么类型的,应该改为WORD PTR [SI+DI]
12 和11题类似
13 IP是指令的偏移地址,可是我觉得这个没有什么问题啊,是不是正确的 啊
14 应该也是类型不明确的问题,应该指明[SI]单元的内容是字还是字节
  

哈哈因为我是好久以前学的汇编,现在手头没有书,所以有些记不清了啊,也可能记的很多东西都不对,你就做个参考吧,不管怎么样希望能给你帮助,学习是需要交流的,如果你知道正确答案的话可以告诉我,我的邮箱是xuxin_tongfeng@163.com如果你有什么问题的话可以给我发邮件,我能帮一定会帮你的

板凳

2楼说的很好~~但有点问题
 11、MOV  AX,[SI+DI]
带双操作数的指令只需要有一个操作数类型明确即可。AX 为寄存器寻址类型明确为16位 这时[SI+DI]就不需要用PTR定义了(也为16位)
这题的错误是表达方式错了,OPS是基址变址方式 应为[SI][DI]
即MOV AX [SI][DI]
  12题我想没错CX是通用寄存器可以那样用。

3 楼

哈哈
谢谢2楼的指点

我来回复

您尚未登录,请登录后再回复。点此登录或注册