Linux Assembly - Welcome Message ================================ Public domain ******************************************************************************** ; This program after asking the name of user ; will say welcome to him/her. ; Filename: welcome.asm ; Compile : nasm -f elf welcome.asm -l welcome.lst ; Link : ld -s -o welcome welcome.o section .data nwln db 0xa,0 ;new line dot db ".",0 ;single dot prompt db "What is your name ? ",0 message db "Welcome ",0 section .bss name resb 32 ;user's name section .text global _start _start: ;write prompt to stdout mov eax,prompt call print_string ;read user's name from stdin mov eax,name ;buffer mov ebx,32 ;length call input_string ;write message to stdout mov eax,message call print_string ;write user's name to stdout mov eax,name call print_string ;write a dot and newline to stdout mov eax,dot call print_string mov eax,nwln call print_string ;and exit mov ebx,0 ;first syscall argument: exit code mov eax,1 ;system call number (sys_exit) int 0x80 ;call kernel ;procedure : write a string to stdout ; input parameters : ; eax must point to string ; string must end with 0 ; syscall : /usr/include/asm-i386/unistd.h ; #define __NR_write 4 ; eax = 4 ; man 2 write : ; ssize_t write(int fd, const void *buf, size_t count); ; ebx=(int fd), ecx=(const void *buf), edx=(size_t count) print_string : mov ecx,eax ;second argument: pointer to message mov edx,0 ;third argument: message length cal_str_len: ;calculate string length inc edx ;start from second char mov ah,[ecx+edx] ;put char in ah cmp ah,0 ;compare char with 0 jne cal_str_len ;if not zero check next char ;until find zero, then length ;will be in edx mov ebx,1 ;first argument: file handle (stdout) mov eax,4 ;system call number (sys_write) int 0x80 ;call kernel ret ;procedure : read a string from stdin ; input parameters : ; eax must point to buffer ; ebx must set to length of buffer ; syscall : /usr/include/asm-i386/unistd.h ; #define __NR_read 3 ; eax = 3 ; man 2 read : ; ssize_t read(int fd, void *buf, size_t count); ; ebx=(int fd), ecx=(void *buf), edx=(size_t count) input_string : mov edx,ebx ;third argument: buffer length mov ecx,eax ;second argument: pointer to buffer mov ebx,1 ;first argument: file handle (stdin) mov eax,3 ;system call number (sys_read) int 0x80 ;call kernel ;finding end of string ;and put zero there mov edx,0 ;init counter for str chars find_crlf: inc edx ;start from second char mov ah,0xa ;we will check 'line feed' cmp ah,[ecx+edx] ;compare 'line feed' with char je set_zero ;if they equal so this is end of str mov ah,0xd ;next check 'carriage return' cmp ah,[ecx+edx] ;compare 'carriage return' with char je set_zero ;if they equal so this is end of str jmp find_crlf ;check next char ;let's set zero instead of set_zero: ;'carriage return' or 'line feed' mov bh,0 ;put zero in bh add ecx,edx ;make ecx point to the end of str mov [ecx],bh ;put zero at the end ret ;exit procedure ******************************************************************************** _BY: Pejman Moghadam_ _TAG: asm, hello-world_ _DATE: 2008-08-09 01:06:50_