2011-12-14 3 views
6

에서 줄 바꿈없이 나는 최근 어셈블리에서의 printf와 scanf와 사용에 대한이 문서 읽었습니다 : 그것의 printf에서 " 을 말한다 특히은 printf와 어셈블리

Meaning of intfmt: db "%d", 10, 0 in assembly

을, 줄 바꿈은 (만약 다음 줄 바꿈 및 인쇄 출력은 라인 버퍼 모드입니다.), 결과를 실제로 볼 수 있도록 내부 출력 버퍼를 플러시합니다. 따라서 10을 제거하면 플러시가없고 출력이 표시되지 않습니다. "

그러나 내 어셈블리 파일에서 출력 한 다음에 줄 바꿈을 원하지 않으면 어떻게해야할지 모르겠다. 는 여기에 내가 줄 바꿈하지 않고 인쇄를 시도하기 위해 작성한 간단한 테스트 파일입니다 :

extern printf 


LINUX  equ  80H  ; interupt number for entering Linux kernel 
EXIT   equ  60  ; Linux system call 1 i.e. exit() 




section .data 
    int_output_format: db "%ld", 0 


segment .text 
    global main 


main: 
    mov r8, 10 
    push rdi 
    push rsi 
    push r10 
    push r9 
    mov rsi, r8 
    mov rdi, int_output_format 
    xor rax, rax 
    call printf 
    pop r9 
    pop r10 
    pop rsi 
    pop rdi 
    call os_return  ; return to operating system 


os_return: 
    mov rax, EXIT  ; Linux system call 1 i.e. exit() 
    mov rdi, 0  ; Error code 0 i.e. no errors 
    syscall  ; Interrupt Linux kernel 64-bit 

하지만 내가 읽은 기사로 표준 출력이 플러시되지 않는 제안합니다. 아마 숫자를 출력 한 후에 어떻게 든 플러시해야 할 필요가 있다고 생각 했나요? 그러나 나는 정말로 확신하지 않는다.

NASM 어셈블리 언어를 사용하고 있습니다.

미리 감사드립니다.

답변

3

내 질문에 대한 정답에 대한

push [_iob] 
call [fflush] 

FASM

에서

3

현재 버퍼에있는 내용을 표시하려면 fflush(stdout);으로 전화하십시오. BasileStarynkevitch 위의 댓글에서 알 수 있듯이 NASM 민속

extern fflush 
extern stdout 
... 
push dword [stdout] 
call fflush 
add esp, 4 
etc... 
+0

내가 그는 C 구문이라고 생각? 어셈블리에서 호출하는 방법을 찾고 있습니다. –

+0

C 표준에 따르면'stdout'은'FILE *'유형의 표현식으로 확장되는 매크로입니다. 컴파일러에서 어떻게 정의되어 있는지 모르겠습니다. 'stdio.h '에서 값을 추출해야합니다. –

+3

그리고 어셈블리 코드에서 더 쉬운'fflush (NULL)'을 호출 할 수 있습니다. 아마'xor % eax, % eax; call fflush' –

3

이다. 내 코드에 추가하는 데 필요한 :

extern fflush 
... 
xor rax, rax 
call fflush 
... 
+0

NASM에서 어떻게 이것을 달성 할 수 있습니까? 똑같은가요? –

1

다른 가능성은 stdout 스트림의 기본 라인 버퍼링을 제거하는 것입니다. 여기에 C가 그렇게 부르짖습니다. 어셈블리로의 변환은 ASM에서 파일/스트림 I/O를 수행하는 것이 합리적이라고 생각하지 않기 때문에 비용/이점이 엄청나게 잘못되었습니다.

setvbuf(stdout, NULL, _IONBF, 0); 

이 방법은 모든 printf (그리고 fputsputc는, puts는 등 ...) 것 암시 fflush

관련 문제