Howdy, Stranger!

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

Categories

Welcome to the new platform of Programmer's Heaven! We apologize for the inconvenience caused, if you visited us from a broken link of the previous version. The main reason to move to a new platform is to provide more effective and collaborative experience to you all. Please feel free to experience the new platform and use its exciting features. Contact us for any issue that you need to get clarified. We are more than happy to help you.

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.