NASM - The Netwide Assembler
NASM Forum => Example Code => Topic started by: jordi on November 06, 2016, 07:08:57 PM
-
Hi,
I have written some simple arithmetic routines in 64 bit assembly that work with what C names long type; i.e., 64 bit signed integers (Linux platform).
I attach 2 files:
- asm64_long.asm
the routines in 64 bit assembly
- test_asm64_long.c
a C program to test the routines against their C counterparts
By itself, the routines are too simple to be of any use in a big project, but show the way they can be interfaced in C. Take into account that in Windows the way arguments are passed is different. (See NASM documentation).
To compile the files without the Makefile:
$ nasm -f elf64 asm64_long.asm
$ gcc -Wall test_asm64_long.c asm64_long.o -o test_asm64_long
Feedback is welcome!
-
Hi Jordi!
Really good to see you able to post here! I have downloaded your files. I seem to have been the only one! They "look right" to me, but I am not able to test 64-bit right now. "Soon", perhaps. Do they seem to work properly for you?
I hope we can get you some feedback soon. This Forum has a bunch of members, but nobody has much to say. Been like this for as long as I can remember. Nasm users are just not a talkative bunch, I guess. Thanks for posting and I hope you post more - even if you have to talk to yourself!
Best,
Frank
-
Hi Frank,
Yes, it seems to work. Here is a sample output:
$ ./test_asm64_long 2309865 -4320000076
Addition:
C: 2309865 plus -4320000076 = -4317690211
ASM64: 2309865 plus -4320000076 = -4317690211
Substraction:
C: 2309865 minus -4320000076 = 4322309941
ASM64: 2309865 minus -4320000076 = 4322309941
Increment:
C: inc(2309865) = 2309866
ASM64: inc(2309865) = 2309866
C: inc(-4320000076) = -4320000075
ASM64: inc(-4320000076) = -4320000075
Decrement:
C: dec(2309865) = 2309864
ASM64: dec(2309865) = 2309864
C: dec(-4320000076) = -4320000077
ASM64: dec(-4320000076) = -4320000077
Sign change:
C: minus(2309865) = -2309865
ASM64: minus(2309865) = -2309865
C: minus(-4320000076) = 4320000076
ASM64: minus(-4320000076) = 4320000076
Maximum:
C : max(2309865, -4320000076) = 2309865
ASM64: max(2309865, -4320000076) = 2309865
Minimum:
C : min(2309865, -4320000076) = -4320000076
ASM64: min(2309865, -4320000076) = -4320000076
Multiplication:
C: 2309865 times -4320000076 = -9978616975549740
ASM64: 2309865 times -4320000076 = -9978616975549740
Division: quotient
C: 2309865 div -4320000076 = 0
ASM64: 2309865 div -4320000076 = 0
Division: remainder
C: 2309865 mod -4320000076 = 2309865
ASM64: 2309865 mod -4320000076 = 2309865
Dision: quotient and remainder in one:
ASM64: 2309865 mdiv -4320000076 : (q: 0 r: 2309865)
Now I see a little bug: Dision for Division ;)
Best,
Jordi
-
Ah. Thought it looked alright. Missed "Dision". Thanks for the feedback, Jordi!
Best,
Frank