2015-01-08 57 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

除非你有一个方便的库,转换功能躺在周围。