I assume you are using Dandamudi's io.mac
on Linux:
Table B.1 Summary of I/O Routines Defined in io.mac
Name Operand(s) Operand location Size What it does
PutCh source value 8 bits Displays the character
register located at source
memory
GetCh destination register 8 bits Reads a character into
memory destination
nwln none — — Displays a carriage return
and line feed
PutStr source memory variable Displays the NULL-terminated
string at source
GetStr destination [,buffer size] memory variable Reads a carriage-return-terminated
string into destination and stores it
as a NULL-terminated string.
Maximum string length is
buffer size-1.
PutInt source register 16 bits Displays the signed 16-bit number
memory located at source
GetInt destination register 16 bits Reads a signed 16-bit number into
memory destination
PutLint source register 32 bits Displays the signed 32-bit number
memory located at source
GetLint destination register 32 bits Reads a signed 32-bit number into
memory destination
(from: Dandamudi, Sivarama P., Introduction to Assembly Language Programming, 2nd ed. 2004)
For your purpose, you must first convert GetLInt
's 32-bit integer to a decimal ASCII string. Then you can convert the single characters into a binary string.
The following program uses a procedure to perform the first conversion. Note that Dandamudi's .EXIT
is not at the end of the source code, but where the program returns to the shell. Furthermore, I do not agree with Dandamudi's approach of linking the character to a variable mask using TEST
. It is easier to isolate one bit per SHL eight times.
%include "io.mac"
.DATA
msg_binary db "Text in binary",0
.UDATA
number resd 1
decimal resb 11 ; Max. ten digits plus one NULL
.CODE
.STARTUP
GetLInt [number] ; Input & convert input to 32-bit integer
PutStr msg_binary
nwln
mov eax, [number] ; Value of number
mov edi, decimal ; Offset of decimal
call int2str ; Convert number to decimal
mov esi, decimal ; Offset of decimal
repeat:
mov al, [esi] ; Load a character
cmp al, 0 ; End of string?
je done ; Yes -> end of repeart
mov ecx, 8 ; Loop eight times
loop1:
shl al, 1 ; Isolate the leftmost bit and shift the rest to the left
jnc print_0 ; if tested bit is 0, print it
PutCh '1' ; otherwise, print 1
jmp skip1
print_0:
PutCh '0' ; print 0
skip1:
loop loop1 ; Loop and decrement ECX
PutCh ' '
add esi, 1 ; Offset of next character
jmp repeat ; Once more
done:
nwln ; New line
.EXIT ; Return to shell
int2str: ; Converts an positive integer in EAX to a string pointed to by EDI
xor ecx, ecx
mov ebx, 10
.LL1: ; First loop: Collect the remainders
xor edx, edx ; Clear EDX for div
div ebx ; EDX:EAX/EBX -> EAX Remainder EDX
push dx ; Save remainder
inc ecx ; Increment push counter
test eax, eax ; Anything left to divide?
jnz .LL1 ; Yes: loop once more
.LL2: ; Second loop: Retrieve the remainders
pop dx ; In DL is the value
or dl, '0' ; To ASCII
mov [edi], dl ; Save it to the string
inc edi ; Increment the pointer to the string
loop .LL2 ; Loop ECX times
mov byte [edi], 0 ; Termination character
ret ; RET: EDI points to the terminating NULL