この論文といくつかのstackoverflowの投稿によると、argcはスタックの一番上にあり、argvはその下にあります。私はそれを行うための約3〜4の異なる方法を試しました:
- 初期化された変数 (.data) にポップする - 出力は を呼び出すことによって行われ
printf
ます。 - 初期化されていないスペース (.bss) にポップ - 出力は呼び出しによって行われます
sys_write()
- 上記と微調整の混合。
フォーラムの誰かからargcとargvがスタックにないと言われましたが、これは理解できません。他の人は同様のコードでそれをどのように行っていますか?
これが私が試みたものの例です(3日分の知識 - 笑わないようにしてください):
section .bss
argc: resd 1 ; alloc 4 bytes for popped value
section .text
global _start
_start:
pop dword[argc] ; pop argc, place in var
mov ebx,0x01 ; file descriptor = STDOUT
mov ecx,argc ; var (addr) - points to buffer
mov edx,1 ; length of buffer (single digit)
mov eax,0x04 ; syscall number for sys_write()
int 0x80 ; request the kernel to make syscall
exit:
mov ebx,0x00 ; arg for sys_exit() - sys_exit(0)
mov eax,0x01 ; syscall number for sys_exit()
int 0x80 ; request the kernel to make syscall
解決策: セクション .data msg dbValue: %d\n
section .text
global main
extern printf
main:
push dword[esp+4]
push msg
call printf
add esp,8
mov eax,0
ret