2017-07-02 62 views
3

爲了好玩,我實現了將bf轉換爲例如bf的brainfuck編譯器。 x86彙編。目前我正在致力於大型機組裝。方言是「HLASM」,主機是IBM的一個370.在hlasm內輸出控制檯上的字符(370)

沙發大部分工作只發射一個字符到操作員的控制檯失敗:我只獲得空格,它看起來像一個隱式換行被添加我不想要)。

任何人都可以找到我的錯誤嗎?

* get a character to display 
     LLGC R6,0(R7) 
* get a pointer to the buffer which will contain the char to displa 
     LA R5,BUFFER 
* store character in buffer 
     STC R6,0(R5) 
* get a pointer to the memory area describing the data to display 
     LA R1,MSGAREA 
* invoke display char 
     SVC 35 

MSGAREA EQU * 
     DC AL2(5) 
     DC XL2'00' 
BUFFER DC C'!' 
+0

您確定要輸出到控制檯嗎?通常情況下,輸出寫入'SYSOUT'或'SYSPRINT'' DD'。你提到添加LF會讓我相信你對「終端」的控制檯感到困惑。 – cschneid

+0

@cschneid是的你是對的,我的意思是用戶連接的終端 –

+0

我建議寫'SYSOUT'' DD'。你需要爲'SYSOUT'編寫一個'DCB'宏,然後使用'OPEN'和'PUT'宏。請注意,I/O是面向記錄的,而不是面向流的,所以我認爲你必須緩衝你的輸出。 – cschneid

回答

2

我建議寫SYSOUTDD給你運行的靈活性,無論是在一批(在你的JCL分配SYSOUT)或交互(分配SYSOUT到我相信這是在TSO默認終端會話) 。

[entry logic, initialization and so forth] 
     OPEN (SYSOUT,OUTPUT) 

     PUT SYSOUT,RECORD 

     CLOSE SYSOUT 
[exit logic]   

RECORD DC CL80' ' 
SYSOUT DCB DDNAME=SYSOUT,           X 
       DSORG=PS,            X 
       MACRF=PM,            X 
       RECFM=FB,            X 
       LRECL=80 

你可能也想看看TPUT, TGET, and TPG macros終端I/O,如果你沒事帶綁你的程序在TSO完全運行。如果您習慣像在Unix中一樣對I/O進行流式傳輸,那麼終端I/O在3270環境中有點奇怪。

DCB記錄在hereOPEN記錄爲herePUT記錄在hereCLOSE記錄在here

+0

要添加上面的答案,幾行代碼可以告訴你,無論您是否在TSO會話中,只需檢查ASCB字段ASCBTSB - 非零意味着您處於TSO會話中,並且可以使用TPUT/TGET。 –

+0

另一件事是您也可以選擇在UNIX服務shell和彙編程序下運行,您會調用BPX1WRT將字節寫入STDOUT文件句柄。這和其他任何* NIX的味道非常相似。 –

+0

@cschnid:由於您不知道代碼的運行位置,因此將樣本更新爲可重入是個好主意。另外,至於「將SYSOUT分配給我認爲是TSO中默認的終端會話」,這裏沒有實際的默認值 - 許多站點在TSO會話JCL中放入了// SYSOUT DD TERM = TS,但是您不能依賴這個。 –