안녕하세요, 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에서만 선언해야합니다. –
\ n : s가 그대로 인쇄되어 있습니까? –