2011-12-15 4 views

답변

4

다음 코드는 Sample nasm programs에서 그대로 복사 :

printf1.asm 기본 호출의 printf :

The nasm source code is printf1.asm 
    The result of the assembly is printf1.lst 
    The equivalent "C" program is printf1.c 
    Running the program produces output printf1.out 

    This program demonstrates basic use of "C" library function printf. 
    The equivalent "C" code is shown as comments in the assembly language. 

; printf1.asm print an integer from storage and from a register 
; Assemble:  nasm -f elf -l printf.lst printf1.asm 
; Link:   gcc -o printf1 printf1.o 
; Run:   printf1 
; Output:  a=5, eax=7 

; Equivalent C code 
; /* printf1.c print an int and an expression */ 
; #include <stdio.h> 
; int main() 
; { 
; int a=5; 
; printf("a=%d, eax=%d\n", a, a+2); 
; return 0; 
; } 

; Declare some external functions 
; 
     extern printf   ; the C function, to be called 

     SECTION .data   ; Data section, initialized variables 

     a:  dd  5    ; int a=5; 
fmt: db "a=%d, eax=%d", 10, 0 ; The printf format, "\n",'0' 


     SECTION .text     ; Code section. 

     global main    ; the standard gcc entry point 
main:       ; the program label for the entry point 
     push ebp    ; set up stack frame 
     mov  ebp,esp 

     mov  eax, [a]  ; put a from store into register 
     add  eax, 2   ; a+2 
     push eax    ; value of a+2 
     push dword [a]  ; value of variable a 
     push dword fmt  ; address of ctrl string 
     call printf   ; Call C function 
     add  esp, 12   ; pop stack 3 push times 4 bytes 

     mov  esp, ebp  ; takedown stack frame 
     pop  ebp    ; same as "leave" op 

     mov  eax,0   ; normal, no error, return value 
     ret      ; return 
+0

64 비트 모드에서 작동하도록 이것을 수정할 수 있습니까? (elf64)? 많은 검색 후 – meltuhamy

+0

다음은 64 비트에 대한 대답입니다. http://forum.nasm.us/index.php?topic=342.0 기본적으로 매개 변수를 푸시하지 마십시오. – meltuhamy