如何使用MASM从数据结构中打印字段值

时间:2013-03-14 16:49:53

标签: assembly masm cpu-registers

下面的MASM程序的目标是声明一个名为Date的简单结构。我将其字段(日,月,年)分别初始化为(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

两个'crt_printf'调用失败。没有它们,程序就能顺利完成。执行消息框并显示消息“myExe.exe已停止工作”。我想我有一个“分段错误”问题。所以我不明白为什么我的寄存器是空的,或者它不是存储这种数据的正确寄存器,或者我的方法可能不好。

有人可以帮助我吗?

1 个答案:

答案 0 :(得分:1)

Date.DayDWORD(即整数),因此您应该使用%d%u而不是%s进行打印。

此外,调用应该是:

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

以传递PrintString的地址作为第一个参数。