Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.04.2011, 02:53   #1
laim
Новичок
Джуниор
 
Регистрация: 01.04.2011
Сообщений: 4
По умолчанию EXE MASM,ошибки при компиляции

Изначально программа была в Сом формате, при компиляции в ехе возникают ошибки
3.asm(60) : error A2206: missing operator in expression
3.asm(89) : error A2206: missing operator in expression

Код:
title Запись чисел ехе файл

        .Model  small
        .Code
        ORG     100h     ; резервирование памяти для
                         ; префикса программного сегмента (PSP)
Start:  jmp     SHORT main     ; обход данных и экономия 1 байт
; ----------------- ДАННЫЕ ------------------------------------------
; !!!!! сегментов ДАННЫХ, СТЕКА, ДОПОЛНИТЕЛЬНОГО НЕТ !!!!!!!
CR_LF   db      0dh,0ah,'$'
L       dw      6
Number  dw      12345
inv     db      'Демонстрация вывода чисeл: $'
OutBuf  db      11 dup(?),'$'   ; Буфер вывода   
; -------------------------------------------------------------------

main    proc    NEAR        ; ТОЛЬКО NEAR !!!! Иначе зависание
        lea     dx,inv
        call    output      ; вывод строки inv
	    Lea     bx,OutBuf      ; адрес буфера вывода
        Mov     ax,Number
	    CALL    Bin_ASCII      ; Binary ---> ASCII
	    Lea     dx,[bx]
        call    output          ; вывод ПОЛОЖИТЕЛЬНОГО числа
        Mov     ax, -157
        CALL    Bin_ASCII      ; Binary ---> ASCII
	    Lea     dx,[bx]
        call    output          ; вывод ОТРИЦАТЕЛЬНОГО числа
        lea	    dx, CR_LF
        call    output          ; переход на след. строку
        ret                 ; IRET - зависание!!!
main    endp

; ---------- вывод строки -------------------------------------------
; ВХОД:
;    DX- начальный адрес строки. 
;               Символ окончания строки '$'.
; ВЫХОД:
;    НЕТ
;--------------------------------------------------------------------
output  proc
        push    ax
	    mov	ah,9
	    int	21h
        pop     ax
	    ret
output	endp

;---------- Procedure Bin_Ascii ----------------------------
; ВХОД:
;     число -------> AX
;     нач. адрес буфера вывода ------> BX
;     длина буфера вывода ------> L
; ВЫХОД:
;       строка цифр в виде -ЦЦЦЦЦ или ЦЦЦЦЦЦ
;       нач. адрес буфера вывода ------> BX
;       факт. длина буфера вывода ------> CX <= L
;----------------------------------------------------------
Bin_Ascii  Proc     Near
            Push    dx si ax
            Mov     cx,L
 
 Fill_Buf:                           ; очистка буфера вывода 
            Mov     Byte ptr [bx],' '
            Inc     bx               ; и установка ВX на конец буфера
            Loop    Fill_Buf
            
            Mov     si,10
            Or      ax,ax           ; число ОТРИЦАТЕЛЬНОЕ?
            Jns     Clr_Dvd         ; НЕТ, обход
            Neg     ax              ; ДА - меняем знак
 Clr_Dvd:
            Xor     dx,dx
            Div     si              ; <DX:AX> = <DX:AX>/10
            Add     dx,'0'          ; остаток -----> ASCII
            Dec     bx
            Mov     Byte PTR [bx],dl ; символ -----> буфер
            Inc     cx               ; кол-во символов
            Or      ax,ax            ; частное = 0 ?
            Jnz     Clr_Dvd          ; НЕТ - продолжаем вычисления
            
            Pop     ax               ; выгружаем  из стека исх. число
            Or      ax,ax            ; оно ОТРИЦАТЕЛЬНОЕ ?
            Jns     NoMore           ; НЕТ, обход
            Dec     bx
            Mov     Byte ptr [bx],'-' ; добавляем знак '-'
            Inc     cx
 NoMore:
            Pop     si dx
            Ret
Bin_Ascii  Endp

        end     start          ; указание точки входа ОБЯЗАТЕЛЬНО!!!
сорец прилагаю.
Вложения
Тип файла: zip 3.zip (1.3 Кб, 8 просмотров)
laim вне форума Ответить с цитированием
Старый 01.04.2011, 03:11   #2
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,432
По умолчанию

Цитата:
3.asm(60) : error A2206: missing operator in expression
В скобочках написан номер строки, где произошла ошибка.
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Старый 01.04.2011, 04:12   #3
laim
Новичок
Джуниор
 
Регистрация: 01.04.2011
Сообщений: 4
По умолчанию

ошибки выбивает в етих строках Push dx si ax
Pop si dx
я хз что добавить
laim вне форума Ответить с цитированием
Старый 01.04.2011, 04:35   #4
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

вероятно, нужно вместо

Код:
Push    dx si ax
нарисовать

Код:
Push    dx
push si
push ax
а вместо

Код:
Pop si dx

развернуть

Код:
Pop si
pop dx
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 01.04.2011, 12:57   #5
laim
Новичок
Джуниор
 
Регистрация: 01.04.2011
Сообщений: 4
По умолчанию

Цитата:
Сообщение от veniside Посмотреть сообщение
вероятно, нужно вместо

Код:
Push    dx si ax
нарисовать

Код:
Push    dx
push si
push ax
а вместо

Код:
Pop si dx

развернуть

Код:
Pop si
pop dx

спс, ошибки пропали
теперь при запуске проги пишет
Процессор NTVDM обнаружил недопустимую инструкцию
скрины прилагаю
Изображения
Тип файла: jpg 1.JPG (44.4 Кб, 64 просмотров)
Тип файла: jpg 2.JPG (37.5 Кб, 56 просмотров)
laim вне форума Ответить с цитированием
Старый 01.04.2011, 13:38   #6
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,162
По умолчанию

laim
1) в функцию main первыми строчками вставь mov ax,@data/mov ds,ax
2) строчку ORG 100h убери это же не СОМ, а ЕХЕ!
3) Данные должны быть в сегменте data, команды в сегменте code,
4) start: jmp main убери
5) вместо RET в main proc напиши mov ah,4Ch/ int 21h
6) в конце программы напиши end main вместо end start

Последний раз редактировалось Mikl___; 01.04.2011 в 14:16.
Mikl___ вне форума Ответить с цитированием
Старый 01.04.2011, 20:03   #7
laim
Новичок
Джуниор
 
Регистрация: 01.04.2011
Сообщений: 4
По умолчанию

Цитата:
Сообщение от Mikl___ Посмотреть сообщение
laim
1) в функцию main первыми строчками вставь mov ax,@data/mov ds,ax
2) строчку ORG 100h убери это же не СОМ, а ЕХЕ!
3) Данные должны быть в сегменте data, команды в сегменте code,
4) start: jmp main убери
5) вместо RET в main proc напиши mov ah,4Ch/ int 21h
6) в конце программы напиши end main вместо end start
большое спасибо, поправил теперь работает
laim вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Синтаксические ошибки при компиляции Ker_33rus Visual C++ 2 07.11.2011 13:24
Ошибки при компиляции vader2 Общие вопросы Delphi 11 29.09.2010 16:33
DLL MASM, ошибки при компиляции Пепел Феникса Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 7 12.03.2010 00:06
Ошибки при компиляции программы (MASM) mustafa1453 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 06.09.2009 05:02
ошибки при компиляции |{ot Общие вопросы Delphi 14 02.08.2008 01:20