View previous topic :: View next topic |
Author |
Message |
sanat Beginner
Joined: 15 Feb 2003 Posts: 11 Topics: 7 Location: chennai
|
Posted: Wed Mar 12, 2003 8:56 am Post subject: Compiler Options (AMODE, RMODE, DATA, RENT) |
|
|
Need some more info on the compiler options. I went thru the manuals, but have the following doubts.
Q1) The manual says RMODE decides where the program should reside when loaded into memory (below line or above the line). It can have a value 24, 31 or ANY. My ques is why the program needs to be loaded aove the line. Does it mean the object module (or, the load module occupies those many bytes...certainly not).
Q2) Is the AMODE specifies the addressing required for calling various system services, addressing required for the data to be handled in the I/O ? Pl. confirm.
Q3) What is the use of DATA option ? Does it the signify the amount of data passed to a sub program from calling program ?
Q4) If the progrm is compiled with RENT option, then the program can be reentrant (or quasi-reentrant). Reentrancy means that program will not modify itself during execution. But, how can a program modify itself and what sort of modifications the program can go thru during run time !!!
Thanks,
Sanat. |
|
Back to top |
|
|
semigeezer Supermod
Joined: 03 Jan 2003 Posts: 1014 Topics: 13 Location: Atlantis
|
Posted: Wed Mar 12, 2003 9:18 am Post subject: |
|
|
Good questions!
1) RMODE defines where the program may be loaded and the only reason to use RMODE(31) or ANY is to reduce the amount of data & programs below 16MB. That memory is a limited resource, which is already half used by the operating system and other programs, so if your program does not need to be there, you want to get it out of the <16MB area. The name given to that problem explains it best: VSCR or Virtual Storage Constraint Relief.
2) You are correct. a little more info though... To understand RMODE you need to understand how an address is created. (ignoring 64 bit, of course), an address is used from a register, and registers are 32 bits. The first bit (bit 0) is ignored as far as addressing goes (it has meaning, but nothing relevent here). The remaining 31 bits define an address of 2GB. But in the old days, only 24 bits were used (bits 7-31) because the machines were 16MB machines and it only takes 24 bits to address that. So the remaining bits (0-7) were often used for some other purpose and now that machines can address the whole 31 bits, the machine needs a way to know to ignore those bits. That is what AMODE does. To get back to your question about I/O, many of the I/O routines use 24 bit addressing because they use that 1st byte for something else. Therefore, the data that the I/O routines will use (control blocks, buffers, etc) must be below 16M; AMODE(24). There are I/O routines that can run 'above the line' that have been around for years, so not all I/O requires AMODE(24). There are other services as well that require AMODE(24) such as some TSO routines (TPUT), and I'm sure many others. Frequently a program is written in 2 parts, the main part is AMODE(31) and the 2nd AMODE(24), with appropriate code to switch modes at runtime (See the BASM or BSM assembler instructions for example).
3) I don't know... sounds like a COBOL question and I don't know COBOL.
4) Two types of self modification exist. Data and instructions. Data modification just means that the data exists within the program; it is stored in the same general place as the program is. Things like local variables and save areas can be done this way. A reentrant program must get storage elsewhere for those data.
The other modification type is instruction modification. That is rarely done these days, but it is possible (and a very bad thing to do), to change instructions within the program at run time. For example, by flipping one or two bits in a conditional Branch (B) instruction you can change it from branch if zero to branch if not zero. This was done when memory was tight but is a disaster to do today for performance and maintainability reasons. |
|
Back to top |
|
|
Dibakar Advanced
Joined: 02 Dec 2002 Posts: 700 Topics: 63 Location: USA
|
Posted: Wed Mar 12, 2003 9:21 am Post subject: |
|
|
Answer to Q4:
'MOVE A TO B' is an example where the code modified itself if B is a variable defined in WORKING-STORAGE SECTION. Since the varaible location is part of the program.
But if B is declared in LINKAGE SECTION then the code is not modified. Even though for reentran program only one load module is copied to memory which is used again and again. But a new copy of LINKAGE SECTION is created every time this program is executed.
Am I right people?
Diba. |
|
Back to top |
|
|
kolusu Site Admin
Joined: 26 Nov 2002 Posts: 12375 Topics: 75 Location: San Jose
|
|
Back to top |
|
|
Anand_R Intermediate
Joined: 24 Dec 2002 Posts: 189 Topics: 60
|
Posted: Wed Mar 12, 2003 1:30 pm Post subject: |
|
|
Hi,
Can u provide the link for all the compiler option explanations..
Thanks
Anand |
|
Back to top |
|
|
kolusu Site Admin
Joined: 26 Nov 2002 Posts: 12375 Topics: 75 Location: San Jose
|
Posted: Wed Mar 12, 2003 3:55 pm Post subject: |
|
|
Anand,
Here is a link to all the compiler option with explanation
http://publibz.boulder.ibm.com/cgi-bin/bookmgr_OS390/BOOKS/IGY3PG00/2.4?DT=20011203125201
A tip that might help you in future. I have posted a link which explains about the compiler option DATA . so there is a very likely chance that the other compiler options are also explained in that (indeed they are ). so now take only the partial part of the link I posted above for ex:
http://publibz.boulder.ibm.com/cgi-bin/bookmgr_OS390/BOOKS/IGY3PG00
The first part is the link to the book and 2.4.12 is the topic number in the link and most likey all the compiler options are explained in topic 2.4 which is the link I posted in this post.
Hope this helps....
cheers
kolusu |
|
Back to top |
|
|
Dibakar Advanced
Joined: 02 Dec 2002 Posts: 700 Topics: 63 Location: USA
|
Posted: Thu Dec 08, 2005 5:33 am Post subject: |
|
|
Quote: |
'MOVE A TO B' is an example where the code modified itself if B is a variable defined in WORKING-STORAGE SECTION. Since the varaible location is part of the program.
|
I was going through old posts and would like to take this oppurtunity to correct my statement.
In CICS 'MOVE A TO B' is still reentrant because CICS maintains different copies of working storage. I am told that ALTER command will make a COBOL CICS program non re-entrant.
Thanks,
Diba. |
|
Back to top |
|
|
MikeBaker Beginner
Joined: 04 May 2004 Posts: 96 Topics: 9
|
Posted: Thu Dec 08, 2005 4:45 pm Post subject: |
|
|
As regards RMODE... there is also a new option available these days called RMODE(SPLIT), whereby the load module can actually be split into two sections, one being RMODE 24 and the other being RMODE 31. |
|
Back to top |
|
|
Naved Beginner
Joined: 09 Dec 2005 Posts: 2 Topics: 0 Location: USA
|
Posted: Fri Dec 09, 2005 10:51 am Post subject: |
|
|
I was going through the old posts and thought of sharing something.'
Related to semigeezer's post Posted: Wed Mar 12, 2003 9:18 am In answer to question of Sanat, you mantioned that the high order bit is used for something.. well.. It's used to tell the processor if the address used in the proceeding bits is in 24 or 31 bit mode. |
|
Back to top |
|
|
Naved Beginner
Joined: 09 Dec 2005 Posts: 2 Topics: 0 Location: USA
|
Posted: Fri Dec 09, 2005 11:10 am Post subject: |
|
|
Example of nonentrant code:
Code: |
START CSECT
-
-
-
-
CONT DS 0H
CP A,B
BH CONT3
AP C,D
CONT1 B CONT3
CP C,G
BH CONT3
BL CONT4
MVI CONT1+1,X'00' <-- THIS WILL CHANGE THE "B" at CONT1 to NOP and in the next pass ' CP C,G' will be executed
AP C,F
CONT3 DS 0H
-
-
-
-
B CONT
|
|
|
Back to top |
|
|
|
|