作者game0416 (凤狼)
看板NTUE-CS102
标题Re: [闲聊] 程设作业
时间Fri Dec 2 11:13:41 2011
#1CuCS0L4 (NTUE-CS102)
旧文再用超安心(?)
虽然说观念一样
写成asm硬生生多个七十行实在很伤脑(抓头)
所以这篇写点code怎麽写好了(?)
内建堆叠很方便,跨副程式用同一组有好有坏这样
--
main开头跟上份作业一样读字串、用esi当指标抓字串每byte装什麽这样
再来以下就能全部重新改写了
首先是每个字元抓近来号开始比较是+-*/或(),中间只要是,就je到相关的处理部分
: '+'=43 '-'=45 '*'=42 '/'=47 '('=40 ')'=41
都不是,那就能直接往下写个数字的输出,一个WriteInt後inc esi解决抓下一个值
如果是+-*/,又分堆叠是不是空的或最顶端运算子优先全跟读到的进行比较的结果是什麽
空的就直接PUSH edx就好,没什麽问题....另外写个变数纪录stack高度就好(?)
: 对不起我没认真念书(跑
要比较优先权的话,就要另外写个判断....
我是多设两个mem变数,把stack里头抓出来的跟字串取得的值存进去
再把对应的优先权存到eax/edx里头,然後比较之後决定处理行为,再把值读回来做处理
大概像这样
--
movzx edx,BYTE PTR[esi]
...
...
mov instring,edx
cmp edx,43 ; (if edx==43) jmp strlow ;edx=1
je strlow
cmp edx,45 ; (else if edx==45) jmp strlow ;edx=1
je strlow
mov edx,2 ; (else) edx =2
jmp strover
strlow:
mov edx,1
strover:
...
...
mov edx,instring
是说我觉得就是这种判断式让行数整个爆多-A-
--
对应'('是惯例的直接PUSH下去
')'的话,另外写个函式部分去取stack里头的东西直到抓到'('时跳出
配合一些特性大概写成这样算比较单纯
POPOUTTO:
sub stackheight,1
pop eax
cmp eax,40
je POPOUTTO_END
call WriteChar
jmp POPOUTTO
POPOUTTO_END:
最後抓完字串抓到EOL之後,再把stack里头的东西全部POP出来就结束了
嗯...比起上份来说,不难...吗(?)
--
红白本命
○楽园の巫女
博丽 霊梦 职业:博丽神社の巫女さん
Hakurei Reimu 能力:主に空を飞ぶ程度の能力
@东方project系列
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 120.127.47.30
※ 编辑: game0416 来自: 120.127.47.30 (12/02 11:13)
1F:推 dosomethnig:恭喜欺侮海成为第十人 12/02 13:18
2F:推 pk873:迟来的人强真好 Q口Q 小弟太晚来跪安了 12/05 00:10
3F:推 j2612280:迟来的人强真好 Q口Q 小弟太晚来跪安了 12/05 00:11