Welcome to the new platform of Programmers 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 it's 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.
counter: db 0xA ;store value 10 in 'counter', while allocating only one byte. This will be used for decrementing purposes
valueToPrint: resb 4 ;alloc 4 bytes of data in 'valueToPrint'
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
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
mov eax, '
' ;store newline character in eax to be printed
call _print_char ;print value
mov eax, 0x2A ;store 42 in eax
mov edx, 0x2B ;store 43 in edx
mul edx ;multiply [eax] * [edx]
mov eax, 1 ;initiate 'exit' syscall
mov ebx, 0 ;exit with error code 0
int 0x80 ;invoke kernel to do its bidding
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'