1

「メッセージ」ブロックに問題があり、それが出力されます (print_less、print_more、print_equal、print_final)。文字列を保存する方法が本当にわからないので、出力に文字列を 2 つ (print_less または print_more または print_equal + print_final) ではなくすべて取得するのはそのためです。

コードは次のとおりです。

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

出力:

[look@me ~]$ 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
4

2 に答える 2

0

長さの計算が正しくありません。たとえば、の値は次のmsg_more_sizeようになります。

msg_more_size = msg_equal-msg_more

$は、実際には現在のコードの場所を示します。つまり$-msg_more、文字列のほぼ全体を意味します。

于 2012-09-16T11:03:40.400 に答える
0

おそらく、文字列がNullで終了していないためです。文字列の最後に追加0して、もう一度試してください。

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

これは、printコマンドがnullに遭遇するまで、文字を印刷し続けるためです。

于 2012-09-16T11:05:52.290 に答える