2013-03-14 51 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

相關問題