gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:38:17 26 4
gpt4 key购买 nike

“消息” block 和它的输出有问题(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

最佳答案

您的长度计算不正确。例如 msg_more_size 的值将是:

msg_more_size = msg_equal-msg_more

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

关于linux - FASM:字符串存储和控制台输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12446225/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com