Loop over multiple arrays simultaneously: Difference between revisions

Content added Content deleted
(→‎{{header|Raku}}: add verbiage, show longhand operation)
(Add 8086 assembly)
Line 71: Line 71:
c C 3
c C 3
</pre>
</pre>

=={{header|8086 Assembly}}==

The 8086 processor has two index registers <code>si</code> and <code>di</code>,
and an address register <code>bx</code>. (There is also the base pointer <code>bp</code>,
which is used to point to the stack segment, and is not used here.)

When addressing memory, the 8086 can automatically add up: 1) one of <code>bx</code> or
<code>bp</code>, plus 2) one of <code>si</code> or <code>di</code>, plus 3)
a direct address.

This code uses <code>si</code> to keep track of the current index, and loads the
base addresses of the arrays into <code>bx</code> one by one.

<lang asm> cpu 8086
bits 16
org 100h
section .text
mov ah,2 ; Tell MS-DOS to print characters
xor si,si ; Clear first index register (holds _i_)
outer: mov di,As ; Put array-of-arrays in second index register
mov cx,Aslen ; Put length in counter register
inner: mov bx,[di] ; Load array pointer into BX (address) register
mov dl,[bx+si] ; Get SI'th element from array
int 21h ; Print character
inc di ; Go to next array (pointers are 2 bytes wide)
inc di
loop inner ; For each array
mov dl,13 ; Print newline
int 21h
mov dl,10
int 21h
inc si ; Increment index register
cmp si,Alen ; If it is still lower than the array length
jb outer ; Print the next items
ret
section .data
;;; Arrays
A1: db 'a','b','c'
A2: db 'A','B','C'
A3: db '1','2','3'
Alen: equ $-A3 ; Length of arrays (elements are bytes)
;;; Array of arrays
As: dw A1,A2,A3
Aslen: equ ($-As)/2 ; Length of array of arrays (in words)</lang>


{{out}}

<pre>aA1
bB2
cC3
</pre>



=={{header|ACL2}}==
=={{header|ACL2}}==