Author Topic: Few very newbie question (NASM)  (Read 3380 times)

Aleko Popov

  • Guest
Few very newbie question (NASM)
« on: June 11, 2009, 05:02:33 PM »
Hello people,
Ok, i should first say that i am ABSOLUTELY new to this topic - assemblers. I read all kind of forums and websites about NASM and assemblers. But i couldn't find anywhere simple info about it. I did some C++ and i am, let's say, 'familiar' with C programing. That's why i need help to understand NASM. Let's say - in C++ i define integer like this: "int a;"
 - float:"double a;"
 - loops: "for(i=1;i<10;i++)"
 and so does this commands look like in NASM? this is my simple can 'define' integers, floating-point numbers, loops and conditions...
If anyone can help and explain with few words, or tell me where i can find such info...please

Tom Timmermann

  • Guest
Re: Few very newbie question (NASM)
« Reply #1 on: June 11, 2009, 05:41:45 PM »
I would suggest downloading and studying the "PC Assembly Tutorial" by Paul Carter.

Also if you compile C code with gcc use:
gcc -S main.c
This will give you an assembly listing.



  • Guest
Re: Few very newbie question (NASM)
« Reply #2 on: June 11, 2009, 06:04:39 PM »
gcc -S is such a bad thing to do for examples for nasm (not being AT&T syntax assembler)... OpenWatcom is free, and fairly solid though, also with options to generate assembly files ... so you can take your example C/C++ code and see what it becomes...

Offline Frank Kotler

  • NASM Developer
  • Hero Member
  • *****
  • Posts: 2395
  • Country: us
Re: Few very newbie question (NASM)
« Reply #3 on: June 11, 2009, 09:25:49 PM »
Hi Aleko,

I agree with Tom that Dr. Carter's tutorial is a good place to start. Since it uses C to interface with the OS, we don't have to ask, "What OS?" :)

Using the "-S" switch with gcc is okay... if you're using gcc... but it isn't even close to "Nasm syntax". Open Watcom may be better... What compiler are you using now?

A tool I recently found is Agner Fog's "objconv", which Mr. Fog has recently taught Nasm syntax! It's intended for other things (converting object formats), but "objconv -fnasm myfile" (.o or executable) does a nice job of disassembling into Nasm syntax - with optimization tips in the comments!

(output file has .asm extension - watch out you don't overwrite your source!)

Ndisasm will disassemble anything, too, of course, but it doesn't know about object/executable formats, and needs a lot more help on the command line.

You may want to look at *both* a disassembly and asm output from your compiler. "All the examples you can get" is good.

As for defining integers... when I was in school, "the integers" was an infinite set of numbers, not just the ones that can be represented in some arbitrary number of bits! When I was trying to learn C, an "int" was 16 bits, as I recall. Now, I guess "int" is 64 bits (???). In asm, we have to be more specific. ("int" in asm is an instruction, not a number)

8 bits, 1 byte - like a "char" in C... unsigned char, I guess...

mybyte db 42

or, to reserve uninitialized space:

mybyte resb 1

16 bits, 2 bytes - a "short" in C, I guess... You'll be using these a lot if you start off with "dos code". In 32-bit code, not so much.

myword dw 42


myword resw 1

32 bits, 4 bytes, a "doubleword" - I guess this in "int" in 32-bit C (???)...

mydword dd 42


mydword resd 1

64 bits, 8 bytes, a "quadword" - maybe this is an "int" in C, these days? Or maybe "size_t"?

myqword dq 42


myqword resq 1

Nasm goes on to tword, oword, yword... that's enough to start with.

Now floats...

Single precision, 32 bits, "float" in C:

myfloat dd 1.23

the decimal point tells Nasm it's a float, not an integer

Double precision, 64 bits, "double" in C:

myfloat dq 1.23

Extended precision, 80 bits (C doesn't know this one!):

myfloat dt 1.23

A "trick" about floats... the "float" parameter to printf is always promoted to double. This is "transparent" (opaque) in C, but you'll need to know about it if you're calling printf from asm!

In asm, "for" and "if" and the like are handled by conditional jumps... Certain instructions set certain bits in the "flags register", and conditional jumps jump to a new location (or not) depending on the state of these flags. Instead of:

if (condition) do this code

we actually write:

if not (condition), jump over this code

myvar db 42


mov al, [myvar]

cmp al, 42
je got_it ; jump if equal
; what to do if we didn't find it
; probably don't want to "fall through" to the "yes" code
jmp done

; what to do if we found it

; exit your program

push 0
call ExitProcess


mov eax, 1
int 80h


mov ah, 4Ch
int 21h

(Nasm will let you use 0xABCD to indicate hexidecimal numbers, like C. I prefer 0ABCDh)

This is apparently a hard concept for some people to "get", but to me it seems much more intuitive than "if", "while", "for" and such. Macros are available to generate code for "if" and all, but learn what it "really does" first...

Tell us what OS you're using, and maybe we can provide more concrete examples...