FASM:字符串存储和控制台输出

时间:2012-09-16 10:34:52

标签: linux assembly fasm

“消息”块及其输出(print_less,print_more,print_equal,print_final)有问题。我真的不知道如何存储字符串,这就是为什么我在输出中得到所有字符串而不是其中两个字符串(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

2 个答案:

答案 0 :(得分:0)

您的长度计算不正确。例如,msg_more_size的值为:

msg_more_size = msg_equal-msg_more

$实际上表示您当前的代码位置。所以$-msg_more几乎意味着整个字符串。

答案 1 :(得分:0)

可能是因为你的字符串没有Null终止。在字符串末尾添加0,然后重试。

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

这是因为print命令继续打印字符,直到遇到null。