2009-06-03 29 views
4

我想在Metal C中使用WTO指令打印出「Hello World」到我的工作日誌。這是基於z/OS V1R10.0 Metal C編程指南和參考的1.2.3.5節中的示例。當我使用WTO時出現的問題我遇到了包含0的緩衝區或ASCII到EBCDIC轉換的問題。我在下面粘貼了我的作業日誌的相關部分,然後是我的代碼,然後是IBM示例中的代碼,我無法編譯它。 工作日誌使用WTO打印從金屬C

 
09.01.56 J0686275 IEF403I IMIJWS0G - STARTED - TIME=09.01.56 
09.01.56 J0686275 +...0....... 
09.01.56 J0686275 -           --TIMINGS (MINS.)--   ----PAGING COUNTS--- 
09.01.56 J0686275 -IMIJWS0G   GO   00  6 .00 .00 .00 1292 0  0  0  0  0  1 
09.01.56 J0686275 IEF404I IMIJWS0G - ENDED - TIME=09.01.56 

我的代碼

 
#include 
#include 
#include 
int main() 
{ 
            struct WTO_PARM { 
       unsigned short len; 
       unsigned short code; 
       char* text; 
      } wto_buff = { 4+11, 0, "hello world" }; 
      __asm(" WTO MF=(E,(%0)) " : : "r"(&wto_buff)); 

     } 

IBM代碼

 
int main() { 

      struct WTO_PARM { 
       unsigned short len; 
       unsigned short code; 
       char text[80];   } wto_buff = { 4+11, 0, "hello world" };   __asm(" WTO MF=(E,(%0)) " : : "r"(&wto_buff)); 
      return 0; 
     } 

回答

2

IBM的例子爲我工作(在z/OS 1.9),但我不得不添加 一個編譯設置代碼頁:上例的頂部 : 的#pragma filetag( 「IBM-500」) 的編譯器不接受char和char [80]中的[和]; 我試圖將字符文本[80]更改爲char *文本,但我得到了和您一樣的 奇怪結果。

1

也許在結構的兩個版本的內存佈局是不一樣的?我想這在GCC:

#include <stdio.h> 

struct WTO_PARM { 
    unsigned short len; 
    unsigned short code; 
    char *text; 
}; 

int main() 
{ 
    struct WTO_PARM moo = { 4+11,0,"hello" }; 
    printf("size %zu struct %p string %p\n", sizeof(struct WTO_PARM),&moo,moo.text); 
    return 0; 
} 

下面是結果:

size 8 struct 0x22cce0 string 0x402000 

不過,如果我更改文本參數的類型爲char [80],結果改爲:

size 84 struct 0x22cc80 string 0x22cc84 

WTO指令可能希望字符串被壓縮到該結構中。

+0

+1更正結構 – 2009-06-09 05:11:08

0

爲什麼不能編譯IBM示例?它適用於我 - 也許你可以告訴我們你的編譯器參數和錯誤信息?

0

你是否通過TN3270客戶端編輯你的代碼?問題很可能與模擬器中的代碼頁相關。例如,我需要在ISPF中進行以下更改:c x'4A'x'AD'all(for [)and c x'5A'x'BD'(for])以編譯源代碼...