请大家帮忙(casl)!我是一个新手!

dream0335 2003-05-13 03:12:44


已知在x和y 两个单元中分别存在两个整数,编程从键盘输入一个字符(‘+’,‘-’,‘*’,
‘/’),根据不同的字符做不同 的运算。当输入的字符不是加减乘除之一时,输出错误。
START
LEA GR4,STACK
IN INBUF ,ILEN
LD GR0,INBUF
LEA GR1,0
LEA GR2,3
FINFOP CPL GR0,OP,GR1
JZE BEGIN
LEA GR1,1,GR1 "?????????"
LEA GR2,-1,GR1
JPZ FINDOP
BEGIN SLL GR1,1 "?????????"
CALL CAL,GR1 "??????????"
EXIT
CADD LD GR0,X
ADD GR0,Y
ST GRO,RESULT
RET
CSUB LD GRO,X
SUBB GRO,Y
ST GRO,RESULT
RET
CMUL LEA GRO,0
LD GR1,Y
CYCLE ADD GR0,X
LEA GR1,-1,GR1
JZE SAVE
JPZ CYCLE
SAVE ST GRO,RESULT
RET
CDIV LD GR0,X
LEA GR1,0
LOOP CPA GR0,Y
JMI STORE
SUB GR0,Y
LEA GR1,1,GR1
JMP LOOP
STORE ST GR1,RESULT
RET
ERROR OUT MES,OLEN
RET
CAL JMP CADD
JMP CSUB
JMP CMUL
JMP CDIV
JMP ERROR
X DS 1
Y DS 1
RESUL DS 1
MES DC 'OP ERROR'
OLE DC 8
INUF DS 1
IEN DS 1
op DC '+'
DC '-'
DC '*'
DC '/'
DS 20
STACK DS 1
END

我不太明白得这里 SLL GR1,1 是什么作用, LEA GR1,1,GR1 已经将 GR1 加1了,
当程序跳转到 BEGIN 时,SLL GR1,1 是什么意思?只是将GR1逻辑左移一位?那他对于下面的
CALL CAL,GR1 有什么作用?
望大家不惜赐教!!! 小弟在这里先谢谢了!!!!!:)
...全文
43 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
shaoyy 2003-05-13
  • 打赏
  • 举报
回复
指令的存储长度是"运算符"的存储长度的2倍,假设是做减法运算,GR1 =1 ,但要实现跳转到
JMP CSUB,GR1要等于2才行。SLL GR1, 1 的作用就是乘2。

CAL JMP CADD
JMP CSUB
JMP CMUL
JMP CDIV
JMP ERROR
shaoyy 2003-05-13
  • 打赏
  • 举报
回复
在执行CALL CAL,GR1时,GR1应是CAL起始对应的几种运算调用指令的偏移量。
在执行SLL GR1,1 之前,GR1是运算符对应op的偏移量,应运算定义的顺序与CAL对应的调用顺序相同,好像直接用GR1作为偏移就行,

但是请注意,

op DC '+'
DC '-'
DC '*'
DC '/'

DC是以"BYTE"定义的,即每个数据的长度是一个字节,而每条指令要占两件字节,所以要乘2,即"GR1逻辑左移一位"。我讲清楚了吗?

2,948

社区成员

发帖
与我相关
我的任务
社区描述
就计算机等级考试、软件初、中、高级不同级别资格考试相关话题交流经验,共享资源。
c1认证c4javac4前端 技术论坛(原bbs)
社区管理员
  • 软件水平考试社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧