what is BSS and BSSEND
News system
news at ism780c.isc.com
Sat Mar 11 08:05:13 AEST 1989
In article <396 at rb-dc1.UUCP> shapiro at rb-dc1.SanDiego.gould.UUCP (Michael Shapiro) writes:
>In article <15498 at cup.portal.com> Tim_CDC_Roberts at cup.portal.com writes:
>
>The IBM 704 used negative indexing. The original FORTRAN comiler
>stored arrays backwards. The symbolic definition of the array name
>went on the end, so the assembler supported it. Programmers used
>backward tables in assembly language and newer assemblers also had the
>BES pseudo-op. (Dim recollection!!! Can anyone confirm/deny/provide
>alternate?)
I have been responding to this via e-mail. But since there several almost
correct answers, I thought I should set the record straight.
1. The 704 assembler did provide the BES pseudo-op.
2. The original FORTRAN compiler did store arrays 'backward'
3. 1 and 2 were not related. The pseudo-op was invented before FORTRAN.
Furthermore, FORTRAN did not output assembly code.
4. BES was provided to simplify declaring arrays that were stored
FORWARD.
The following Assembly code shows a two instruction loop for zeroing every
second word of a forward stored array (i.e. X(1),X(3)...X(9)):
WITH BSS WITH BES
-------- --------
AXT 10,1 AXT 10,1 set index to 10
STZ X+10,1 STZ X,1 store zero at address minus index
TIX *-1,1,2 TIX *-1,1,2 if current index is >2, decremment by 2
... ... and branch
X BSS 10 X BES 10
| |
| +--- Reserve 10 words X is address of 11th word
+-------------------- Reserve 10 words X is address of first word
The heart of the matter was TIX. This instruction conditionally DECREMENTS
the contents of an index register and branches. So the index register is
initialized to the array size and counted down. In the case of FORTRAN the
index register was initialized to the initial value and counted up. It was
the choice to count up in the DO loop along with the fact that indexing was
by subtraction that led to FORTRAN arrays being stored backward. Below is
the compiled code for a FORTRN loop that does the same as the above.
FORTRAN GENERATED CODE
-------------- ------------------
DO 100, i=1,10,2 AXT 1,1 set index to 1
100 X(I)=0; STZ X+1,1 X(I) = 0
TXI *+1,1,2 increment I by 2 and branch (to next)
TXL *-2,1,10 loop if I <= 10
Note that the 704 did not have a single instruction for incrementing and
branching, so the FORTRAN loop control used two instructions instead of one.
This is one reason people thought assembly would always be needed.
BTW, in the days when still had REAL programmers :-), loops were called "TIX
loops".
Marv Rubinstein -- World's oldest active programmer
More information about the Comp.lang.c
mailing list