0

下面的 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 已停止工作”。我想我有一个“分段错误”的问题。所以我不明白为什么我的寄存器是空的,或者它可能不是存储这种数据的正确寄存器,或者我的方法可能不好。

有人可以帮助我吗?

4

1 回答 1

1

Date.Day是一个DWORD(即一个整数),所以你应该使用%dor%u而不是%s打印它。

此外,调用应该是:

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

为了将地址PrintString作为第一个参数传递。

于 2013-03-14T18:00:21.093 回答