2013-03-14 82 views
0

下面的MASM程序的目标是声明一个简单的称为Date的结构。我将它的字段(日,月,年)分别初始化为(09,01,1980)。我只想打印Day字段的值。如何使用MASM打印来自数据结构的字段值

这里的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

Date.DayDWORD(即一个整数),所以应该使用%d%u而非%s打印。

此外,调用应该是:

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

以的PrintString地址通过作为第一个参数。

+0

感谢您的回答,但即使我使用%d或%u也是如此。解决方法是使用print str $(ecx)。有用 ! – user1364743 2013-03-14 18:06:35

+0

这可能也适用,但使用'crt_printf'确实可以处理我列出的更改。我在我的系统上确认了它。 – Michael 2013-03-14 18:17:31

相关问题