ASCII print to stdout (console) in NASM/Linux - Programmers Heaven

Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!

Categories

ASCII print to stdout (console) in NASM/Linux

Hi, I'm trying to write an assembly programming which multiplies the values stored in two registers, and converts the result to ASCII. I need to know what exactly what it is that I'm doing wrong, as I keep getting segmentation faults and/or floating point exceptions. The comments in the code should explain in detail how I'm trying to accomplish this, but I find that most of my issues keep happening when I try do div edx by eax :/

Any thoughts? I think I have to actually *initialize* the registers, though I don't quite know how to do that. Thanks.

[b]Code[/b]

[code]
section .data
counter: db 0xA ;store value 10 in 'counter', while allocating only one byte. This will be used for decrementing purposes
section .bss
valueToPrint: resb 4 ;alloc 4 bytes of data in 'valueToPrint'

section .text

global _start

_print_char:
add eax, '0' ;convert to ascii
mov [valueToPrint], eax ;store contents of 'eax' in valueToPrint
mov eax, 4 ;syswrite
mov ebx, 1 ;stdout
mov ecx, valueToPrint ;machine will take whatever value exists in 'ecx' and print
mov edx, 1 ;print only a single byte's worth of data
int 0x80 ;invoke kernel to perfrom instruction
ret

_convert_values:
mov edx, 0xA ;dividing eax by 10, which will lower its tens place
div edx ;do division: remainder SHOULD be stored in edx
mov byte [edx], 0x0 ;zero out edx
call _print_char ;do printing for latest character
dec byte [counter] ;decrement counter
mov dword [eax], counter ;store counter in eax
jnz _convert_values ;while eax > 0 continue process

_endl:
mov eax, '
' ;store newline character in eax to be printed
call _print_char ;print value
ret

_mul:
mov eax, 0x2A ;store 42 in eax
mov edx, 0x2B ;store 43 in edx
mul edx ;multiply [eax] * [edx]
ret

_safe_exit:
mov eax, 1 ;initiate 'exit' syscall
mov ebx, 0 ;exit with error code 0
int 0x80 ;invoke kernel to do its bidding

_start:
nop ;used to keep gdb from complaining

call _mul ;multiply the values
call _convert_values ;do hex to ascii conversion

jmp _safe_exit ;use jmp as opposed to call since it technically doesn't 'ret'

[/code]
Sign In or Register to comment.