On Jun 30, 5:12pm, Shawn T. Rutledge wrote:
> > > You can do assembly in Linux, the assembler is as86. There is also
> > > nasm I believe.
> >
> > Don't forget gas. (The GNU ASsembler used by gcc.)
>
> The man page for as says that it is the GNU assembler. I thought
> maybe as86 was the x86 component of it but they are actually two
> separate executables on my system.
The man page for as86 (on my system) says that it takes source
files whose syntax is closer to that of the intel/microsoft assembler.
It's not clear to me if it's built on top of gas or not.
> > > But I haven't done it. I suspect you could still
> > > make function calls to libc functions for doing output, etc. I
> > > don't think it gets much use outside the kernel itself.
> >
> > I think you're talking about inline assembler. It comes in handy from
>
> No I was talking about how to do hello world...
I see.
> ...you'd need to write to stdout. That would involve either a libc
> call or a direct ioctl call wouldn't it?
Right. The example that I gave called libc's write(). But the
implementation of write() in libc just consists of setting up some
registers and then doing a syscall. It's kind of interesting to
look at, so here it is:
(gdb) x/24i write
0x4000ef00 <__libc_write>: push %ebx
0x4000ef01 <__libc_write+1>: mov 0x10(%esp,1),%edx
0x4000ef05 <__libc_write+5>: mov 0xc(%esp,1),%ecx
0x4000ef09 <__libc_write+9>: mov 0x8(%esp,1),%ebx
0x4000ef0d <__libc_write+13>: mov $0x4,%eax
0x4000ef12 <__libc_write+18>: int $0x80
0x4000ef14 <__libc_write+20>: pop %ebx
0x4000ef15 <__libc_write+21>: cmp $0xfffff001,%eax
0x4000ef1a <__libc_write+26>: jae 0x4000ef1d <__libc_write+29>
0x4000ef1c <__libc_write+28>: ret
0x4000ef1d <__libc_write+29>: push %ebx
0x4000ef1e <__libc_write+30>: call 0x4000ef23 <__libc_write+35>
0x4000ef23 <__libc_write+35>: pop %ebx
0x4000ef24 <__libc_write+36>: xor %edx,%edx
0x4000ef26 <__libc_write+38>: add $0x4945,%ebx
0x4000ef2c <__libc_write+44>: sub %eax,%edx
0x4000ef2e <__libc_write+46>: push %edx
0x4000ef2f <__libc_write+47>: call 0x4000df80 <__errno_location>
0x4000ef34 <__libc_write+52>: pop %ecx
0x4000ef35 <__libc_write+53>: pop %ebx
0x4000ef36 <__libc_write+54>: mov %ecx,(%eax)
0x4000ef38 <__libc_write+56>: or $0xffffffff,%eax
0x4000ef3b <__libc_write+59>: jmp 0x4000ef1c <__libc_write+28>
Notice that over half of the code is for dealing with errno.
Anyway, if you didn't want to drag libc into your executable, you
could do the ``int $0x80'' yourself.
Kevin