## geno93n0

I need help converting numbers...

I'm supposed to make a program that takes an input, which can be binary, hex, decimal or octal, then convert said input to the remaining bases.

It's supposed to have a menu, where I can pick the base of the input.

I found a code on the internet for converting decimal to binary:

``````radix 10

;org 100h

; (hex: 5h)

mov al, 2

; print result in binary:
mov bl, al
mov cx, 8
print: mov ah, 2   ; print function.
mov dl, '0'
test bl, 10000000b  ; test first bit.
jz zero
mov dl, '1'
zero:  int 21h
shl bl, 1
loop print
; print binary suffix:
mov dl, 'b'
int 21h

; wait for any key press:
mov ah, 0
int 16h

ret``````

My problem here is that we havent been taught some of the other commands there, specifically RADIX, TEST and SHL. Also, I can't make this code accept any form of input. Tried mov ah,01h then int 21h but it didnt come out right.

## wildgoose 420

RADIX ? Haven't heard of that!

TEST is a Read-Only AND. Does the same AND but the result is not stored, but the flags are still set!

``````A  B    A ^ B
0  0       0
0  1       0
1  0       0
1  1       1``````

For SHL MSB is shifted into Carry and zero is shifed into LSB.

``````10100101         A5h
Carry  <--- MSB             LSB <-- 0

Carry      Bits
X   10100101

1   01001010    <-- 0
0   10010100
1   00101000
0   01010000
0   10100000
1   01000000
0   10000000
1   00000000``````

I'm modified your code to be branchless. You should examine how it functions! You should avoid LOOP unless you are on an ancient 8086.

``````; print result in binary:
mov ch, al          ; Get 8-bit byte
mov cl, 8

print: mov dl,'0'
shl ch,1            ; shift  MSB into carry
adc dl,0            ; '0' or '1'    dl = dl + 0 + carry
mov ah,2
int 21h

dec cl
jnz print

; print binary suffix:
mov dl, 'B'  ;
int 21h      ; DOS interrupt``````

## geno93n0

Thanks, but I need to convert my numbers to 16-bit binary..how do I go about that?

EDIT:
I also need a way for the numbers to accept input..also this is only for the binary portion....the real assignment is to convert one base to all the other bases (i.e. decimal to hex, binary and octal, binary to hex, dec, and oct and so on)

## wildgoose 420

This prints 16-bit boolean values

``````; print result in binary:
mov bx, ax          ; Get 16-bit halfword
mov cl, 16          ; 16 bits

print: mov dl,'0'
shl bx,1            ; shift  MSB into carry
adc dl,0            ; '0' or '1'    dl = dl + 0 + carry
mov ah,2
int 21h

dec cl
jnz print

; print binary suffix:
mov dl, 'B'  ;
int 21h      ; DOS interrupt``````

## geno93n0

Wow, it works! Thank you so much!

Now all I need is a mechanism to accept an input so that the value doesn't have to be predefined in-program, then I'll be all set to try the next few sets.

## geno93n0

Hmm ok, now I've got something.

Now I need to convert a string input into decimal so that it ties in with the convert code above...any ideas?

## wildgoose 420

Come on, that's really easy! You need to think these things out instead of asking to be spoon fed. You need to write the code first then I'll review!

``````char ary[] = "1234"

n = 0
v = 0
while ary[n]
i = ary[n] - 0x30
v = (v * 10) + i
n++
end while

v is number``````

## geno93n0

Well I'm sorry for being sick with the flu for a week when we took up this lesson.

And...isn't that a C++ code?

EDIT:
Oh, I see.

## geno93n0

This is what I've got. I've got a byte/word combination error, and I still have no idea on how to convert the DECIMAL string into a real decimal string.

``````~^
#ERROR messages will be removed if you leave these first two lines in     @@@@#
JMP MAIN

PROMPT1 	DB      'INPUT DECIMAL: \$'

DNAME		LABEL	BYTE
DMAXL		DB	5
DLEN		DB	?
DECIMAL		DB	5 DUP ('\$')

MAIN:

INPUT_DECIMAL:
MOV 	AH,09H
LEA 	DX,PROMPT1
INT 	21H

MOV 	AH,0AH
LEA 	DX,DNAME
INT 	21H

CALL 	NEWLINE

mov 	ax,decimal
~             ^
#ERROR 13: Byte/Word Combination Not Allowed                              @@@@#

; print result in binary:
mov 	bx, ax          ; Get 16-bit halfword
mov 	cl, 16          ; 16 bits

print:
mov 	dl,'0'
shl 	bx,1            ; shift  MSB into carry
adc 	dl,0            ; '0' or '1'    dl = dl + 0 + carry
mov 	ah,2
int 	21h

dec 	cl
jnz 	print

mov 	dl, 'B'  ;
int 	21h      ; DOS interrupt

; wait for any key press:
mov 	ah, 0
int 	16h

ret

;DISPLAY:
;	CALL	NEWLINE
;	MOV 	AH,09H
;       LEA 	DX,DECIMAL
;       INT 	21H

;EXIT:
;	INT	20H

NEWLINE:

MOV 	AH,02H
LEA 	DL,0AH
INT 	21H
MOV 	DL,0DH
INT 	21H
RET``````

## wildgoose 420

I use pseudo code or C (NEVER C++) to proof an logic flow before writing it in assembly code!

You need something like...

``````DECIMAL		DB 32         ; BIGGER BUFFER  N + 3
DB 0
DB 0
DB 32 DUP (' ')

lea 	bx,DECIMAL       ; <-- Get the case correct!
call           GetInteger
; ax,dx contain decimal number``````

...same as you did for printing the strings! Note, as usual I'm doing this in my head so it may not assemble or work.

``````GetInteger:
mov cl,[bx+2]     ; Get # of characters read into buffer
dec cl    ; remove carriage return from length?
xor dx,dx           ; val = 0
\$num:
mov ax,dx
shl  dx,3     ; x 8

mov ah,0
mov al,[bx+3]    ; get a character
inc  bx

sub al,'0'
add dx,ax           ;   val = (val * 10) + digit

dec cl
jnz  \$num

mov  ax,dx
ret``````

## scarlet21

guys... can you pls..help me...we have a project in assembly a86 w/c is the 4 basic mathematical operation...you should input value...and my problem is on the division, it always divideover flow...what should i do? pls guide me...