callされるサブルーチン自体をアセンブリプログラムで出力する方法はないでしょうか?
やはり、サブルーチンのアセンブリプログラムを見るにはサブルーチンのみを別のプログラムとしてアセンブリ出力するしかないのでしょうか?
例えばですが以下のプログラムのcallによって呼び出されたmemcpyの中身は呼び出されただけで中身がブラックボックスであるため中身を知るにはmemcpyのソースコードを別にアセンブリ言語で出力するしかないのでしょうか?
まあ、呼び出しただけなので、中身を見るのは別の作業が必要に思えます。
mov rcx, rax mov r8, rdi mov rdx, rbx call memcpy
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
VisualStudioでデバッグ実行してアセンブリ表示に切り替えてステップイン実行が可能だったはずです
memcpyのソースをMSは公開しています。
(ライセンスを指定していないのでオープンソースというと語弊がありますが)
MSVC2013のamd64は
"C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\crt\src\memcpy.c"
ですかね
MSVC2017 Communityですと
"C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.12.25827\crt\src\x64\memcpy.asm"
がデフォルトのインストール位置でしょう。
投稿2018/02/24 15:06
総合スコア15147
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/03/08 11:02
2018/03/08 14:46
2018/03/08 15:07
2018/03/08 15:08
0
ベストアンサー
Visual Studio のデバッガでmemcpyに飛び込んでみた。
かたやコチラ↓が C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.12.25827\crt\src\x64\memcpy.asm
mov r11, rcx ; save destination address mov r10, rdx ; save source address cmp r8, 16 ; if 16 bytes or less jbe MoveBytes16 ; go move them quick cmp r8, 32 ; check for length <= 32 (we know its > 16) jbe Move17to32 ; go handle lengths 17-32 as a special case sub rdx, rcx ; compute offset to source buffer jae CopyUp ; if above or equal, go move up mov rax, r10 ; else check that src+count < dst add rax, r8 ; src + count cmp rcx, rax ; (src + count) < dst jl CopyDown ; no, buffers overlap go move downward CopyUp: cmp r8, 128 jbe XmmCopySmall bt __favor, __FAVOR_ENFSTRG ; check for ENFSTRG (enhanced fast strings) jnc XmmCopyUp ; If Enhanced Fast String not available, use XMM ; use Enhanced Fast Strings ; but first align the destination dst to 16 byte alignment StringCopy: mov rax, r11 ; return original destination pointer mov r11, rdi ; save rdi in r11 mov rdi, rcx ; move destination pointer to rdi mov rcx, r8 ; move length to rcx mov r8, rsi ; save rsi in r8 mov rsi, r10 ; move source pointer to rsi rep movsb ; copy source to destination buffer mov rsi, r8 ; restore rsi mov rdi, r11 ; restore rdi ret
同じもんみたいやね、ッタリマエだけど。
投稿2018/02/25 00:18
編集2018/02/25 00:24総合スコア16614
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/02/25 21:47
2018/02/25 21:51
2018/02/25 21:52
2018/02/25 23:06
2018/02/26 04:04
2018/02/26 05:51
2018/02/27 07:44
2018/03/07 22:39
2018/03/08 01:05
0
Windowsの場合ですが、Windbgを使用してWindows APIの実装を調べたりはします。
Debugging Tools for Windows (WinDbg, KD, CDB, NTSD)
uコマンドで逆アセンブルできるので内部実装が分かります。
投稿2018/02/24 13:16
総合スコア818
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
Windowsプログラムの場合で述べます。
プログラムをどうやって起動しているかわかりませんが、普通プログラムを起動した段階で(下請けを含めて)命令列やリソースがメモリ上に読み込まれます。(一部のdllやリソースは起動後に必要に読み込みます)ですので、プロセスメモリダンプすればバイナリデータとして出力できます。
まあ、手っ取り早い方法としては、OllyDBGなりを経由してプログラムを起動し、当該下請け関数でブレークすれば良いと思いますけど。
投稿2018/02/24 13:00
総合スコア4830
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/02/24 15:11
2018/02/24 22:19
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。