Talk:100 doors/8086 Assembly
Appearance
More optimized implementation
(using the syntax for "flat assembler") <lang asm> format binary org 0x0100
- Initialization
- Marking 100 doors as closed
mov di,doors xor ax,ax ; two zero-value bytes mov cx,0x32 rep stosw ; fill 50 words (50 * 2 bytes)
- The result of "100 doors" task will be
- "1 00 1 0000 1 000000 1 ..."
- Every open door is offset by the next multiple of 2 closed doors
- Following the steps
- [next_position] = previous_position + counter
- counter = counter + 2
- where [0] is the first door position
- and the counter is set to 3
- [3] = 0 + (1 + 2)
- [8] = 3 + (3 + 2)
- [15] = 8 + (5 + 2)
- etc.
not al ; open door is marked by byte 0xFF mov di,doors ; the `stosb` instruction will always increase the destination register ; we can use this fact to initialize the counter with 2 ; by setting it to 0 and increasing at the beginning of the loop
xor cx,cx ; is 2 bytes long, where `mov cx,0x02` is 3 bytes long
.door_loop:
inc cx ; or `add cl,0x02`, although this approach uses less bytes inc cx
stosb
; Notice that `ch` (upper 8 bits of `cx`) here needs to be set to 0 ; because we are adding 16-bit registers
add di,cx
cmp di,(doors + 0x64) ; have we reached the 101th door? jb .door_loop ; if not, continue the loop
- Here you can implement some code that outputs the result to the screen
- Exiting the program (assuming it is run under MS-DOS)
mov ax,0x4C00 int 0x21
- Pointer to the uninitialized memory allocated for the COM file
- directly after our code
doors: </lang>
Compiled code is 33 bytes long, including 10 bytes of instructions for 100 bytes table initialization.