2015-01-08 55 views
0

我剛剛嘗試在x86程序集中編寫我的第一個程序,我不知道爲什麼,但它沒有達到我想要的。沒有錯誤,沒有通信,但在執行'執行'後程序不能打開。我希望這些程序添加兩個變量併發回他們的總和。這裏是代碼:彙編程序 - 添加兩個變量

.386 
.model flat, stdcall 
option casemap:none 

include windows.inc 
include user32.inc 
include kernel32.inc 

includelib user32.lib 
includelib kernel32.lib 

.data 
a dw 1h 
b dw 2h 
z dw 01 dup(?),0 
.data? 

.code 
start: 
    mov ds, ax 
    mov ax, a 
    mov bx, b 
    clc 
    add ax, bx 
    mov edi, offset z 
    mov [edi], ax 

    mov ah, 09h 
    mov dx, z 
    int 21h 

    mov ah, 4ch 
    int 21h 

end start 

請幫助我:C

+0

目前還不清楚您是否試圖將其編譯爲16位代碼。 (如果是這樣,爲什麼中間會有EDI?)。你寫的東西看起來像舊的DOS時代的裝配,它不會在任何現代系統上運行。如果你想學習現代裝配,我建議你看看最近的教程/書籍。 – tux3

+0

您似乎正在創建一個Windows可執行文件,但代碼是用於DOS的。這是行不通的。找到一個Windows程序集教程(IIRC MASM32包含大量的示例代碼)。 – Michael

+0

請注意,如果你堅持使用DOS中斷,那麼DOSBox應該仍然可以運行。 – tux3

回答

0

DOS function 09h需要一個字符串;具體地說,是一個字節數組,每個字節包含一個字符的ASCII碼,終止24小時(ASCII碼爲$)。例如:

z db '3$' 

這相當於與:

z db 33h, 24h 

相反,您已定義z看作單詞的陣列,和填充03H的第一個字(1 + 2的結果)。在ASCII中,03h是non-printing character

程序集不是一些高級語言,具有方便的自動類型轉換。在彙編中,您必須自己將數字值轉換爲一系列ASCII字符。

如何做到這一點?這已經被無數次地問過了。像這裏:Assembly, printing ascii number

除非你有一個方便的庫,轉換功能躺在周圍。