나는 'O'와 'K'다음에 개행 문자를 인쇄하기위한 간단한 64 비트 어셈블리 프로그램이 있습니다. 그러나 'K'는 절대로 인쇄되지 않습니다. 이 프로그램의 목표 중 하나는 rax 레지스터의 하위 비트에있는 값을 ASCII 문자로 인쇄하는 것입니다. 이 프로그램은 교육용으로 작성된 64 비트 Linux 전용이므로 C 스타일 시스템 호출을 사용할 필요가 없습니다.64 비트 Linux에서 인터럽트 0x80 사용
문제가 mov QWORD [rsp], rax
또는 mov rcx, rsp
인 것으로 의심됩니다.
현재 프로그램은 'O'다음에 개행 문자 만 출력합니다.
어떻게하면 렉스의 값을 사용하도록 프로그램을 변경 한 다음 'K'를 출력하여 전체 출력이 'OK'다음에 개행이되도록 할 수 있습니까?
bits 64
section .data
o: db "O" ; 'O'
nl: dq 10 ; newline
section .text
;--- function main ---
global main ; make label available to the linker
global _start ; make label available to the linker
_start: ; starting point of the program
main: ; name of the function
;--- call interrupt 0x80 ---
mov rax, 4 ; function call: 4
mov rbx, 1 ; parameter #1 is 1
mov rcx, o ; parameter #2 is &o
mov rdx, 1 ; parameter #3 is length of string
int 0x80 ; perform the call
;--- rax = 'K' ---
mov rax, 75 ; rax = 75
;--- call interrupt 0x80 ---
sub rsp, 8 ; make some space for storing rax on the stack
mov QWORD [rsp], rax ; move rax to a memory location on the stack
mov rax, 4 ; function call: 4
mov rbx, 1 ; parameter #1 is 1
mov rcx, rsp ; parameter #2 is rsp
mov rdx, 1 ; parameter #3 is length of string
int 0x80 ; perform the call
add rsp, 8 ; move the stack pointer back
;--- call interrupt 0x80 ---
mov rax, 4 ; function call: 4
mov rbx, 1 ; parameter #1 is 1
mov rcx, nl ; parameter #2 is nl
mov rdx, 1 ; parameter #3 is length of string
int 0x80 ; perform the call
;--- exit program ---
mov rax, 1 ; function call: 1
xor rbx, rbx ; return code 0
int 0x80 ; exit program
eax, ebx, ecx 및 edx 대신 rax, rdi, rsi 및 rdx를 사용하고''int 0x80'''을''''syscall'''으로 변경하면 프로그램이 " O "와 개행 문자가 있습니다. 32 비트 버전이 올바르게 작동합니다. – Alexander
'int 0x80'도 64 비트 모드에서도 작동하지만 64 비트 호출 규칙 (레지스터와 syscall 번호를 사용해야 함)을 따라야합니다. – Jester
@jester 제 답변에 좀 더 명확하게 "편집"을 추가했습니다. –