2011-12-16 2 views
2

안녕하세요, printf를 사용하여 주어진 문자열을 인쇄하는 일부 어셈블리 코드를 작성하려고합니다. 나는 데이터 섹션에서 사용하기 전에 내 문자열을 선언하고 다음과 같이 테스트 예제 같습니다printf 어셈블리로 새 줄 인쇄

nasm -f elf64 test.asm; gcc -m64 -o test test.o 

그리고 마지막으로 실행 :

./test 
다음과 같이 나는 다음 컴파일하고있어

extern printf 
extern fflush 

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

section .data 
    outputstringfmt: db "%s", 0 
    sentence0: db "Hello\nWorld\n", 0 


segment .text 
    global main 


main: 
    mov r8, sentence0 
    push r8 
    call print_sentence 
    add rsp, 8 
    call os_return 

print_sentence: 
    push rbp 
    mov rbp, rsp 
    push r12 
    mov r12, [rbp + 16] 
    push rsi 
    push rdi 
    push r8 
    push r9 
    push r10 
    mov rsi, r12 
    mov rdi, outputstringfmt 
    xor rax, rax 
    call printf 
    xor rax, rax 
    call fflush 
    pop r10 
    pop r9 
    pop r8 
    pop rdi 
    pop rsi 
    pop r12 
    pop rbp 
    ret 

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 

다음과 같이

내 출력은 다음과 같습니다

Hello\nWorld\n 
,691

sentence0: db "Hello", 10, 0 
sentence1: db "World", 10, 0 

을 한 후 두 번 인쇄 전화 : 363,210

정말 다음에 최대 sentence0 분할 싶지 않아요. 그것을 할 수있는 더 좋은 방법이 있습니까?

미리 감사드립니다.

+0

더 나은 방법을? –

+0

문자열을 여러 문자열 선언으로 나눌 필요가 없습니다. 저는 문자열의 일부로 개행 문자를 인쇄하고 문장 0에서만 선언해야합니다. –

+0

\ n : s가 그대로 인쇄되어 있습니까? –

답변

9

NASM은 작은 따옴표로 문자열을 받아들 ('...') 또는 큰 따옴표 ("..."를) 이는 동등하고 이스케이프를 제공하지 않습니다. 또는 역 인용 부호 (`...`)로, 원하는 스타일의 C 스타일 이스케이프를 지원합니다.

(section 3.4.2, "Character Strings", in the documentation를 참조하십시오.)

그래서이 시도 : 정확히 무엇을 할

sentence0: db `Hello\nWorld\n`, 0 
+0

고마워요. –

3

출력 할 문자열에 줄 바꿈 (\ n)이 있습니다. 그들은 개행 문자로 취급되기 위해 형식 문자열에 있어야합니다. 각 단어 후이 해야 인쇄 뉴 라인처럼

outputstringfmt: db "%s\n%s\n", 0 
sentence0: db "Hello", 0 
sentence1: db "World", 0 

그리고 뭔가 :이 문제의 절반을 해결

outputstringfmt: db "%s", 0 
sentence0: db "Hello", 10 , "World", 10 , 0 
+0

문자열의 새 줄이 어디서 테스트되는지를 제어 할 권한이 없습니다. 나는 printf를 C에서 사용하려고 시도했다. 그리고 당신은 형식에서 줄 바꿈을 지정할 필요가 없으며 여전히 그것들을 잘 처리하는 것처럼 보인다. 나는 왜 내 집회가 그들을 다루지 않는지 궁금해하고 있었다. –

+0

구현에 민감 할 수도 있습니다. 나는 그것이 "어떻게"행동해야하는지 익숙하지 않다. –

+0

C 컴파일러는 \ n을 단일 0xA 문자로 변환합니다. 그것은 컴파일러에서 문자열 파서 (printf가 아니라)입니다. nasm이 생성하는 것을 분해하고 nasm이 어셈블러처럼 C 컴파일러처럼 구문 분석 할 수있는 옵션이있을 수 있습니다. –