1


この論文といくつかのstackoverflowの投稿によると、argcスタックの一番上にあり、argvはその下にあります。私はそれを行うための約3〜4の異なる方法を試しました:

  • 初期化された変数 (.data) にポップする - 出力は を呼び出すことによって行われprintfます。
  • 初期化されていないスペース (.bss) にポップ - 出力は呼び出しによって行われますsys_write()
  • 上記と微調整の混合。

フォーラムの誰かからargcargvがスタックにないと言われましたが、これは理解できません。他の人は同様のコードでそれをどのように行っていますか?

これが私が試みたものの例です(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
4

1 に答える 1