下面的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已停止工作”。我想我有一个“分段错误”问题。所以我不明白为什么我的寄存器是空的,或者它不是存储这种数据的正确寄存器,或者我的方法可能不好。
有人可以帮助我吗?
答案 0 :(得分:1)
Date.Day
是DWORD
(即整数),因此您应该使用%d
或%u
而不是%s
进行打印。
此外,调用应该是:
invoke crt_printf, ADDR PrintString,
[ebx].Date.Day
以传递PrintString
的地址作为第一个参数。