मैं मैरी के साथ (ए * बी) * (सी * डी) करने के लिए एक साधारण गुणा करने की कोशिश कर रहा हूं। मैं हर गुणा चरण के लिए एक नया सबरूटीन बनाकर इसे करने में सक्षम हूं, लेकिन मैं केवल एक सबरूटीन का उपयोग करने के लिए जेएनएस का प्रयास करना और उपयोग करना चाहता हूं। यहाँ कोड का मेरा हिस्सा है

Clear
Store result
Input
Output
Store a
Load a
Skipcond 800
Jump negres
Input
Output
Store b
Load b
Skipcond 800
Jump negres
Input
Output
Store c
Load c
Skipcond 800
Jump negres
Input
Output
Store d
Load d
Skipcond 800
Jump negres
Load a
Store X
Load b
Store Y
JnS loop
Load zoop
Store X
Load zoop
Store Y
Load result
Store Y
Load c
Store X
JnS loop
Load zoop
Store X
Load zoop
Store Y
Load result
Store Y
Load d
Store X
JnS loop
Jump halt


loop,        Load zoop
         Load result
         Add Y
         Store result
         Load X
         Subt one
         Store X
         Skipcond 400
         Jump loop
         Load zoop
         JumpI loop


negres,      Load zoop
         Store result
         Jump halt

halt,   Load result
         Output
         Halt

a, DEC 0
b, DEC 0
c, DEC 0
d, DEC 0
zoop, DEC 0
X, DEC 0
Y, DEC 0
one, DEC 1
result, DEC 0

समस्या पहली बार में है जब मैं लूप को कॉल करता हूं, यह पहले पुनरावृत्ति के माध्यम से जाता है, स्किपकोंड को पास करता है और फिर सबरूटीन से निर्देश के लिए वापस कूदता है जहां इसे बुलाया गया था।

यह मेरा पहली बार जेएनएस का उपयोग कर रहा है, इसलिए किसी भी मदद की बहुत सराहना की जाएगी!

0
Andrew Sanders 10 नवम्बर 2020, 20:11

1 उत्तर

सबसे बढ़िया उत्तर

JnS निर्देश सबरूटीन के पहले शब्द में रिटर्न एड्रेस को स्टोर करता है।

(यह दृष्टिकोण १९६० के दशक में आम था जब प्रोसेसर के लिए मानक एक पुनरावर्ती कॉल स्टैक था - समर्पित हार्डवेयर द्वारा समर्थित, जैसे स्टैक पॉइंटर होना। पीडीपी -8 ने सबरूटीन कॉल ठीक उसी तरह से की जैसे MARIE।  पैरामीटर भी इनलाइन पास किए गए थे, उदाहरण के लिए पैरामीटर के रूप में डेटा मान कॉल के तुरंत बाद रखा गया था (पीडीपी -8 JMS पर) और सबरूटीन पैरामीटर से पहले वापसी पते को आगे बढ़ाएगा।)

इस प्रकार, MARIE सबरूटीन्स को एक डेटा शब्द से शुरू करने की आवश्यकता है, और, ध्यान दें कि यह डेटा शब्द निष्पादित नहीं है, बल्कि अधिलेखित है।

          ...
          JnS subr         # call subr, maybe from main
          ...
          Halt


subr,     Hex 0            # placeholder for return address
          load Result      # first instruction of subr
          ...
          JumpI subr       # set program counter = return address

इसके अलावा, क्योंकि किसी भी सबरूटीन का पहला शब्द डेटा है (कोड पता जिस पर वापस जाना है), यदि आप फ़ंक्शन के शीर्ष पर एक लूप रखना चाहते हैं, तो आपको दूसरे लेबल की आवश्यकता होगी - पहले कोड< पर /em> निर्देश, जो डेटा शब्द के बाद है। Jump subr लूप बनाने के लिए काम नहीं करेगा क्योंकि डेटा शब्द को सबर पर निष्पादित करना बुरा होगा, क्योंकि यह एक निर्देश नहीं है।

subr,     Hex 0            # placeholder for return address
top,      load Result      # first instruction of subr
          ...
          SkipCond 400
          Jump top         # loop to first instruction of subr
          ...
          JumpI subr       # set program counter = return address
1
Erik Eidt 10 नवम्बर 2020, 17:39