# inverting digits

does anyone know how i can create an inverted integer from one saved in ax? For example, how can i create the number 4995 from the number 5994? Thank you!

• : does anyone know how i can create an inverted integer from one saved in ax? For example, how can i create the number 4995 from the number 5994? Thank you!
:

i am a newbie to assembly so there probably is a better way to do this, and if anyone knows it i would also like to know. the only way that i can think of to do this is to convert the binary number in ax into BCD (binary-coded-decimal) format, then perform a rotate left by 4 on al then the same again on ah, then after that you would need to do a rotate by 8 on ax

e.g ax=4995 (bcd)
al=95 (bcd)
rol al,4
al=59 (bcd)
ah=49 (bcd)
rol ah,4
ah=94 (bcd)

ax=9459 (bcd)
rol ax,8
ax=5994 (bcd)

i'm afraid that i can't provide any code for this problem as i am not that good yet, and some of the ideas maybe wrong, like i am not sure if you can perform a rotate on a 8 bit register so you might have to use bx or something for the second pair. also i don't actually know how to convert from decimal to bcd but i am sure that there is someone on this board that knows how to, this is by no means a complete answer but i hope that is helps in some way!
Mike
• : does anyone know how i can create an inverted integer from one saved in ax? For example, how can i create the number 4995 from the number 5994? Thank you!
:
Ok, if AX holds the decimal value, 1234,
you want AX to hold the decimal value 4321. (right?)
If it was a hex value you're talking about,
you could XCHG AH,AL
then rotate the bits of each by 4
but a decimal value is a different story
(& your 5994 wasn't written as 5994h ).

I would invert a decimal number the dum way,
convert the AX value to an decimal ASCII string in memory,
reverse that string,
then get the value of the string.
I would do it that way cause I made PROC's that I can just call
to do the work for me.

CALL WMEMDWB ; Write AX to MEMory as a Decimal ASCII #
;write some reverse data code here, get & push, pop & write
CALL GINNUM ; Get INput NUMber from memory into AX reg
STOSW ; write AX to ES:DI in memory somewhere

You can have them if you want? at:
http://bitdog.home.att.net/files/nasmenv.zip
(A free working Nasm environment with includes, macros, examples, etc)

I hope that helps somehow.
If it's for class, you arn't going to look like a genus though.

• [b][red]This message was edited by bigmike500 at 2003-2-17 4:21:3[/red][/b][hr]
here is the source code for tasm that demonstrates digit reversing assuming that the input is bcd.
Mike

;this source code shows the rotate function to mess around with values in a register
;complied with tasm 5 and tlink
;mike 17/02/03

.model small
.stack
.data

number_input db "insert the 4 digit number that you want to convert: ","\$"
number_out db 10,13,"the inputted number reversed is: ","\$"
continue db 10,13,"press any key to continue","\$"

inputted_num db 5,?,5 dup(?)
outputted_num db 5,?,5 dup(?),10,13,"\$"

.code
main proc
mov ax,@data ;initialises the data segment register
mov ds,ax

mov dx, offset [number_input] ;general prompt stuff
mov ah,09h
int 21H

mov ah,0Ah
mov dx, offset [inputted_num] ;general input stuff
int 21h

xor dx,dx ;clean the register
xor ax,ax ;clean the register
mov cx,4 ;load count register with number of digits
mov bx,2 ;gives a offset adjustment to input string
get_input: ;setting up a bcd number
mov dl,[inputted_num+bx] ;mov the sperate input digits to a register
sub dx,30h ;covert from ascii
add ax,dx ;adds the seperate parts to ax
dec cx ;decrement counter register
cmp cx,0 ;if count is zero get out of the loop
jz convert ;to the convert tag
inc bx ;moves address to next character in the string
shl ax,4 ;moves inputted value to give room for the next value
jmp get_input ;back to loop

convert: ;ax should equal inputed number in bcd
rol al,4 ;changing stuff around
rol ah,4
rol ax,8

;ax now contains the reverse inputted number
;so need to put the value of ax to a string to be outputted

mov bx,2 ;gives a offset adjustment to input string
mov ch,4 ;counter of the number of digits
mov cl,12 ;a shift counter
get_output:
push ax ;store the reversed number
shr ax,cl ;shift to the right to get the wanted digit in al
and al,15 ;clear the higher nibble
add al,30h ;convert the value to ascii to be output in string
mov [outputted_num+bx],al ;save to the string
dec ch ;decrement the digit counter
cmp ch,0
jz display_out ;if zero exit the loop
sub cl,4 ;need to shift 4 bits at a time
inc bx ;move to next space in string
pop ax ;reihstore reversed digit
jmp get_output ;continue loop

display_out:

mov dx, offset [number_out] ;general output stuff
mov ah,09h
int 21H

mov dx, offset [outputted_num+2] ;output the reversed digit string
mov ah,09h
int 21H

exit:
mov dx, offset [continue] ;general output stuff
mov ah,09h
int 21H

xor ax,ax ;press any key to continue
int 16h

mov ax,4c00h ;returns control back to dos
int 21h

main endp
end main