Code:Linux does have/provide support of assembly programming. 'gas' is generic provided assembler. It uses AT&T syntax 'nasm' also works for RH7.1 and it uses Intel syntax both of these applications are on the linux distribution disk. Here is an example of the two forms to show the same functionality example is taken from Assembly Language Step-by-Step by J.Duntemann AT&T || Intel || movl -4(%ebx), %eax || mov dword eax,[ebx-4] || movb 28(%ebx,%edi), %eax || mov byte eax,[ebx+edi+28] IMO the Intel is easier to read. ======================================== There is a high level kind of assembler programming and a lower level, kernel mode assembler. The higher level is a hybrid of C and assembly, (CASM). The lower form is using kernel sys calls via interupt 80h (int 80h). J.Duntemann's book is very basic introduction level programming and he uses the CASM style of programmming. Just forgetting stack frame creation and destruction for a minute, here is how you would write a text message to the standard output (1) i.e. screen [section .text] extern puts ; clib function global main ; entry point for linker main: ; ; create stack frame code push dword message ; push address of msg on stack call puts ; function call add esp, 4 ; realign stack ; ; destroy stack frame code [section .data] message: db "hello",0x0A,0x00 ======================================== Now a more advanced style (not covered by Dunteman) int 80h type goes like this. PZ's simple int80h demo read a file and output it to standard output i.e the screen compile/link/execute -------------------- nasm -f elf read_write01.asm gcc read_write01.o -o demo01 ./demo01 read_write01.asm ------------------ cut from here --------------------------------- BITS 32 GLOBAL _start SECTION .text O_RDONLY EQU 0 sys_close EQU 1 sys_read EQU 3 sys_write EQU 4 sys_open EQU 5 std_oput EQU 1 _start: mov ebp,esp mov eax,[ebp] ; argc mov [argc],eax ; copy the address value to variable lea ebp,[esp+4] mov eax,[ebp] ; argv0 mov[argv0],eax lea ebp,[esp+8] mov eax,[ebp] ; argv1 mov [argv1],eax Openit: mov eax,sys_open ; open mov ebx,[argv1] ; path in argv[1] of command line mov ecx, O_RDONLY ; read only mov edx, 0 ; permission mode not relevant to read int 0x80 mov[filedesc],eax ; save the returned file descriptor printfd: mov eax,sys_write ; write mov ebx,std_oput ; standard output mov ecx,filedesc ; print the file descriptor mov edx,4 ; it is 4 bytes long int 0x80 readit: mov eax,sys_read ; read mov ebx,[filedesc] ; our file, just opened mov ecx,storage ; scratchpad area mov edx,1024 int 0x80 printit: mov eax,sys_write ; write mov ebx,std_oput ; standard output mov ecx,storage ; output what was read in from the file mov edx,1024 int 0x80 finish: mov eax,sys_close int 0x80 SECTION .bss argc RESD 1 argv0 RESD 1 argv1 RESD 1 filedesc RESD 1 storage RESB 1024 ----------------------- finish cut ------------------------- ========================================== You can also mix and match CASM with int80h, which is sometimes easier if you are a bit lazy. Another thing that is permisable is to use inline assembler embedded into C code. Infact this is how the Linux kernel is constructed. example: static inline void set_in_cr4(unsigned long mask) { mmu_cr4_features |= mask; __asm__("movl %%cr4,%%,%%eax\n\t" "orl %0,%%eax\n\t" "movl %%eax,%%cr4\n" : : "irg" (mask) :"ax"); } really nice looking this inline AT&T assmbler with C, ey? Next lesson how to grab ring-0 with buffer overflows *lol* PZ p.s. remember how when kids advance from baby languages like BASIC to Pascal, Fortran, C/C++ etc they are told to forget all about GOTO cus now we are learning structured programming, well once you get back to serious system level programming you start using GOTO again. *grin* The linux kernel consists of about 1 in every 80 lines has a GOTO. C-ASM inline is dirty powerful programming, who cares if we cheat.




