|
/* write.s */ .data hello: .string "hello world\n" .text .globl _start _start: movl $SYS_write,%eax // SYS_write = 4 movl $STDOUT,%ebx // fd = fileno(stdio) movl $hello,%ecx // buf = str movl $12,%edx // count = 0x6 int $0x80 movl $SYS_exit
ssize_t write(int fd, const void *buf, size_t count)
/* mmap.s */ .data fd: .long 0 fdlen: .long 0 mappedptr: .long 0 .text .globl _start _start: subl $24,%esp // open(file, O_RDONLY); movl $SYS_open,%eax movl 32(%esp),%ebx // argv[1], %esp+8+24 de xorl %ecx,%ecx // %ecx'i O_RDONLY, yani 0 yap int $0x80 test %eax,%eax // dönen değer < 0 ise çık js exit movl %eax,fd // fd'i sakla // lseek(fd,0,SEEK_END); movl %eax,%ebx xorl %ecx,%ecx // göreli bellek konumunu sıfır yap movl $SEEK_END,%edx movl $SYS_lseek,%eax int $0x80 movl %eax,fdlen // dosya uzunluğunu sakla xorl %edx,%edx // mmap(NULL,fdlen,PROT_READ,MAP_SHARED,fd,0); movl %edx,(%esp) movl %eax,4(%esp) movl $PROT_READ,8(%esp) movl $MAP_SHARED,12(%esp) movl fd,%eax movl %eax,16(%esp) movl %edx,20(%esp) movl $SYS_mmap,%eax movl %esp,%ebx int $0x80 movl %eax,mappedptr // göstericiyi sakla // write(STDOUT, mappedptr, fdlen); movl $STDOUT,%ebx movl %eax,%ecx movl fdlen,%edx movl $SYS_write,%eax int $0x80 // munmap(mappedptr, fdlen); movl mappedptr,%ebx movl fdlen,%ecx movl $SYS_munmap,%eax int $0x80 // close(fd); movl fd,%ebx // dosya tanımlayıcıyı yükle movl $SYS_close,%eax int $0x80 exit: // exit(0); movl $SYS_exit,%eax xorl %ebx,%ebx int $0x80 ret
#include <sys/types.h> #include <sys/stat.h> #include <sys/mman.h> #include <fcntl.h> #include <unistd.h> #define STDOUT 1 void main(void) { char file[] = "mmap.s"; char *mappedptr; int fd, filelen; fd = fopen(file, O_RDONLY); filelen = lseek(fd, 0, SEEK_END); mappedptr = mmap(NULL, filelen, PROT_READ, MAP_SHARED, fd, 0); write(STDOUT, mappedptr, filelen); munmap(mappedptr, filelen); close(fd); }
%esp | %esp+4 | %esp+8 | %esp+12 | %esp+16 | %esp+20 |
---|---|---|---|---|---|
00000000 | filelen | 00000001 | 00000001 | fd | 00000000 |
$ cat mmap.s .include "defines.h" .data file: .string "mmap.s" fd: .long 0 filelen: .long 0 mappedptr: .long 0 .globl main main: push %ebp movl %esp,%ebp subl $24,%esp // open($file, $O_RDONLY); movl $fd,%ebx // fd kaydediliyor movl %eax,(%ebx) // lseek($fd,0,$SEEK_END); movl $filelen,%ebx // dosya uzunluğu kaydediliyor movl %eax,(%ebx) xorl %edx,%edx // mmap(NULL,$filelen,PROT_READ,MAP_SHARED,$fd,0); movl %edx,(%esp) movl %eax,4(%esp) // dosya uzunluğu hala %eax içerisinde movl $PROT_READ,8(%esp) movl $MAP_SHARED,12(%esp) movl $fd,%ebx // dosya tanımlayıcısı yükleniyor movl (%ebx),%eax movl %eax,16(%esp) movl %edx,20(%esp) movl $SYS_mmap,%eax movl %esp,%ebx int $0x80 movl $mappedptr,%ebx // ptr kaydediliyor movl %eax,(%ebx) // write($stdout, $mappedptr, $filelen); // munmap($mappedptr, $filelen); // close($fd); movl %ebp,%esp popl %ebp ret $
Not | |
---|---|
Yukarıdaki kaynak kodu Örnek 9.2 örneğindeki kaynak kodundan farklıdır. Yukarıda bulunan kaynak kodu diğer sistem çağrılarını, bu bölümün konusu olmadıkları için, göstermemektedir. Yukarıdaki kod sadece mmap.s dosyasını açar, oysa Örnek 9.2 kaynak kodu komut satırı parametrelerini okumaktadır. mmap örneği dosya uzunluğunu okumak için de lseek'i kullanmaktadır.
|
/* socket.s */ .text .globl _start _start: sub $12,%esp // socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); movl $AF_INET,(%esp) movl $SOCK_STREAM,4(%esp) movl $IPPROTO_TCP,8(%esp) movl $SYS_socketcall,%eax movl $SYS_socketcall_socket,%ebx movl %esp,%ecx int $0x80 movl $SYS_exit,%eax xorl %ebx,%ebx int $0x80 ret
|