elf64コンパイルを使用していて、パラメーターを取得してコンソールに書き出そうとしています。
関数を./testwooopとして呼び出しています
gdbを使用してステップスルーした後、問題はないようです。すべてが正常にセットアップされています。
rax:0x4 rbx:0x1 rcx:文字列を指し、x / 6cb$rcxは'w''o''o''o''p'0x0 rdx:0x5<---長さを正しく決定します
int 80h raxに-14が含まれ、コンソールに何も出力されない場合。.dataで文字列を定義すると、機能します。gdbは、同じ方法で$rcxの値を表示します。
何か案は?これが私の完全な情報源です
%define LF 0Ah
%define stdout 1
%define sys_exit 1
%define sys_write 4
global _start
section .data
usagemsg: db "test {string}",LF,0
testmsg: db "wooop",0
section .text
_start:
pop rcx ;this is argc
cmp rcx, 2 ;one argument
jne usage
pop rcx
pop rcx ; argument now in rcx
test rcx,rcx
jz usage
;mov rcx, testmsg ;<-----uncomment this to print ok!
call print
jmp exit
usage:
mov rcx, usagemsg
call print
jmp exit
calclen:
push rdi
mov rdi, rcx
push rcx
xor rcx,rcx
not rcx
xor al,al
cld
repne scasb
not rcx
lea rdx, [rcx-1]
pop rcx
pop rdi
ret
print:
push rax
push rbx
push rdx
call calclen
mov rax, sys_write
mov rbx, stdout
int 80h
pop rdx
pop rbx
pop rax
ret
exit:
mov rax, sys_exit
mov rbx, 0
int 80h
ありがとう
編集:以下のようにシステムコールの作成方法を変更した後、正常に動作します。助けてくれてありがとう!
sys_writeは1になりました
sys_exitは60
になりましたstdoutはrbxではなくrdiに
なります書き込みする文字列はrsiに設定され、rcxint80hは
syscallに置き換えられません