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

Обратите внимание, что DOSBox все равно сможет запустить это, если вы настаиваете на использовании прерываний DOS. – 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

Если, конечно, у вас нет удобной библиотеки с функциями преобразования, лежащими вокруг.

Смежные вопросы