2012-09-16 4 views
1

"메시지"블록에 문제가있어 출력됩니다 (print_less, print_more, print_equal, print_final). 정말 문자열을 저장하는 방법을 모르겠다. 그래서 나는 그 중 2 개 (print_less 또는 print_more 또는 print_equal + print_final) 대신 모든 출력을 내 출력으로 가져오고있다.FASM : 문자열 저장 및 콘솔 출력

여기에 코드입니다 :

format ELF64 executable 


;============================================= 
;================== DATA ===================== 
;============================================= 
segment readable writeable 
;============================================= 


;============================================= 
;     variables 
;============================================= 

a dq 26h 
b dq 100h 
c dq 4h 
d dq 3h 


;============================================= 
;     messages 
;============================================= 

msg_less db 'a < b',0xA,0 
msg_more db 'a > b',0xA,0 
msg_equal db 'a = b',0xA,0 
msg_final db 'Completed successfully',0xA,0 


;============================================= 
;    message sizes 
;============================================= 

msg_more_size = $-msg_more 
msg_less_size = $-msg_less 
msg_equal_size = $-msg_equal 
msg_final_size = $-msg_final 


;============================================= 
;================== CODE ===================== 
;============================================= 
segment readable executable 
;============================================= 

entry $ 

_begin: 
    mov rcx,[a] 
    cmp rcx,[b] 

    jl print_less 
    jg print_more 
    je print_equal 

_final: 
    mov edx,msg_final_size 
    lea rsi,[msg_final] 

    mov edi,1 ; STDOUT 
    mov eax,1 ; sys_write 
    syscall 

    jmp syscall_exit 


;============================================= 
;    print message segment 
;============================================= 

print_less: 
    mov edx,msg_less_size 
    lea rsi,[msg_less] 
    jmp syscall_msg 

print_more: 
    mov edx,msg_more_size 
    lea rsi,[msg_more] 
    jmp syscall_msg 

print_equal: 
    mov edx,msg_equal_size 
    lea rsi,[msg_equal] 
    jmp syscall_msg 


;============================================= 
;    syscall segment 
;============================================= 

syscall_msg: 
    mov edi,1 ; STDOUT 
    mov eax,1 ; sys_write 
    syscall 

    jmp _final 

syscall_exit: 
    xor edi,edi ; exit code 0 
    mov eax,60 ; sys_exit 
    syscall 

출력 :

[[email protected] ~]$ fasm ~/workspace/ASM/ASM1/asm.asm && ~/workspace/ASM/ASM1/asm 
flat assembler version 1.70.03 (16384 kilobytes memory) 
3 passes, 364 bytes. 
a < b 
a > b 
a = b 
Completed successfully 
Completed successfully 

답변

0

귀하의 길이 계산이 올바르지 않습니다. 예를 들어 msg_more_size의 값은 다음과 같습니다

msg_more_size = msg_equal-msg_more 

$ 실제로 현재 코드의 위치가 어디 의미한다. 따라서 $-msg_more은 거의 전체 문자열을 의미합니다.

+0

시작 포스트가 업데이트되었습니다. 하단에 출력됩니다. – user1597430

+0

답변을 업데이트했습니다. –

+0

예, 그렇습니다. 감사합니다;) – user1597430

0

아마도 문자열이 널 종료되지 않았기 때문일 수 있습니다. 문자열 끝에 0을 추가하고 다시 시도하십시오.

msg_less db 'a < b',0xA, 0 ; <-- Null added 

인쇄 명령이 null을 만날 때까지 문자를 계속 인쇄하기 때문입니다.

+0

시작 부분이 업데이트되어 하단에 출력됩니다. – user1597430