0

以下のMASMプログラムの目的は、Dateと呼ばれる単純な構造体を宣言しています。そのフィールド(Day、Month、Year)をそれぞれ(09、01、1980)として初期化します。Dayフィールドの値を出力したいだけです。

MASMコードは次のとおりです。

.386
.model flat, stdcall
option casemap :none

include                         \masm32\include\windows.inc
include                         \masm32\include\kernel32.inc
include                         \masm32\include\masm32.inc
includelib                      \masm32\lib\kernel32.lib
includelib                      \masm32\lib\masm32.lib
include                         \masm32\include\msvcrt.inc
includelib                      \masm32\lib\msvcrt.lib

Date struct
    Day     DWORD               ?
    Month   DWORD               ?
    Year    DWORD               ?
Date ends

.data

PrintString                     BYTE                        "%s", 0

Monday                          Date                        <09, 1, 1980>

.data?

Pointer                         DWORD                       ?

.code

start:

    mov     ebx,                OFFSET Monday
    mov     ecx,                [ebx].Date.Day

    invoke  crt_printf,         PrintString,
                                [ebx].Date.Day

    ;invoke crt_printf,         PrintString,
    ;                           ecx

_quit:
    invoke  ExitProcess,        0

end start

2つの'crt_printf'呼び出しが失敗しました。それらがないと、プログラムは正常に終了します。「myExe.exeが動作を停止しました」というメッセージが表示されたメッセージボックスを実行します。「セグメンテーション違反」の問題があると思います。したがって、レジスタが空である理由、この種のデータを格納するのに適切なレジスタではない、または私のアプローチが適切でない理由がわかりません。

誰かが私を助けることができますか?

4

1 に答える 1

1

Date.Dayは a DWORD(つまり整数) であるため、出力するのではなく%dorを使用する必要があります。%u%s

また、呼び出しは次のようにする必要があります。

invoke  crt_printf,         ADDR PrintString,
                            [ebx].Date.Day

のアドレスをPrintString最初の引数として渡すため。

于 2013-03-14T18:00:21.093 に答える