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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.10.2010, 09:37   #1
tuition
Новичок
Джуниор
 
Регистрация: 11.10.2010
Сообщений: 3
По умолчанию Ошибка при компилляции в Delphi 2007 кода assembler

Всем доброго времени суток.

Есть программа на Delphi которая использует вставку на assembler:

function Full;assembler;
Asm
MOV AX,Max
DIV WordBit
PUSH AX
XOR AH,AH
CMP AX,$0000
JZ @4
MOV CX,AX
LEA SI,FullSet
LES DI,[Long]
CLD
REPE CMPSW
JE @4
POP AX
JMP @2
@4:
POP AX
MOV CL,AH
XOR CH,CH
INC CX
MUL WordSize
MOV DI,AX
LES BX,[Long]
MOV DX,ES:[BX+DI]
LEA BX,Hex
@5:
MOV AX,CX
DEC AX
DIV WordBit
XCHG AL,AH
MUL WordSize
MOV SI,AX
TEST DX,[BX+SI] <<< Ошибка здесь
LOOPNZ @5
JZ @2
@1:
MOV AL,$01
JMP @3
@2:
MOV AL,$00
@3:
End;

Ошибка звучит следующим образом: Operand size mismatch.

Полный исходный pas файл прилагается.

Большая просьба помочь. Спасибо.
Вложения
Тип файла: txt longset.txt (6.7 Кб, 125 просмотров)
tuition вне форума Ответить с цитированием
Старый 11.10.2010, 09:50   #2
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,162
По умолчанию

tuition
попробуй так
TEST DX,word ptr [BX+SI]
Mikl___ вне форума Ответить с цитированием
Старый 11.10.2010, 09:59   #3
tuition
Новичок
Джуниор
 
Регистрация: 11.10.2010
Сообщений: 3
По умолчанию

Цитата:
Сообщение от Mikl___ Посмотреть сообщение
tuition
попробуй так
TEST DX,word ptr [BX+SI]
Получил следующую ошибку:
E2116 Invalid combination of opcode and operands

Спасибо за ответ.
tuition вне форума Ответить с цитированием
Старый 11.10.2010, 10:54   #4
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,162
По умолчанию

tuition
Вот текст твоей программы переведенной на ассемблер, как всё это должно работать не знаю, но компилируется без ошибок, кстати в ассемблере для возврата из процедуры требуется команда RET проблема скорре в том что не обявлены переменные Number, WordSize, WordBit, Hex, Long, Long1, Long2, Max, FullSet, EmptySet и их тип word, byte, long
Код:
.286
.model small
.code
start:	mov ax,@data
	mov ds,ax
	mov es,ax
Add_ proc;assembler;
        MOV     AX,Number
        DIV     WordBit
        PUSH    AX
        XCHG    AL,AH
        MUL     WordSize
        MOV     SI,AX
        LEA     BX,Hex
        MOV     DX,[BX+SI]
        POP     AX
        MUL     WordSize
        MOV     DI,AX
        LES     BX,[Long]
        OR 	ES:[BX+DI],DX
Add_ endp

BitAnd  proc ;assembler;
        MOV     AX,Max
        DIV     WordBit
        INC     AL
        XOR     CX,CX
        MOV     CL,AL
        INC     CX
    @1:
        MOV     AL,CL
        DEC     AL
        MUL     WordSize
        MOV     SI,AX
        LES     BX,[Long1]
        MOV     DX,es:[BX+SI]
        LES     BX,[Long2]
        AND     DX,es:[BX+SI]
        LES     BX,[Long]
        MOV     es:[BX+SI],DX
        LOOP    @1
BitAnd  Endp;

BitNot proc ;assembler;
        MOV     AX,Max
        DIV     WordBit
        INC     AL
        XOR     CX,CX
        MOV     CL,AL
        INC     CX
    @1:
        MOV     AL,CL
        DEC     AL
        MUL     WordSize
        MOV     SI,AX
        LES     BX,[Long]
        NOT     WORD PTR ES:[BX+SI]
        LOOP    @1
BitNot  Endp;

BitOr  proc ;assembler;
        MOV     AX,Max
        DIV     WordBit
        INC     AL
        XOR     CX,CX
        MOV     CL,AL
        INC     CX
    @1:
        MOV     AL,CL
        DEC     AL
        MUL     WordSize
        MOV     SI,AX
        LES     BX,[Long1]
        MOV     DX,ES:[BX+SI]
        LES     BX,[Long2]
        OR      DX,ES:[BX+SI]
        LES     BX,[Long]
        MOV     ES:[BX+SI],DX
        LOOP    @1
BitOr  Endp;

BitXOr  proc ;assembler;
        MOV     AX,Max
        DIV     WordBit
        INC     AL
        XOR     CX,CX
        MOV     CL,AL
        INC     CX
    @1:
        MOV     AL,CL
        DEC     AL
        MUL     WordSize
        MOV     SI,AX
        LES     BX,[Long1]
        MOV     DX,ES:[BX+SI]
        LES     BX,[Long2]
        XOR     DX,ES:[BX+SI]
        LES     BX,[Long]
        MOV     ES:[BX+SI],DX
        LOOP    @1
BitXOr  Endp;

Clear  proc ;assembler;
        MOV     AX,Max
        DIV     WordBit
        INC     AL
        XOR     CX,CX
        MOV     CL,AL
        INC     CX
        MOV     AX,0
        LES     DI,[Long]
        CLD
        REP     STOSW
Clear  Endp;


Del  proc ;assembler;
        MOV     AX,Number
        DIV     WordBit
        PUSH    AX
        XCHG    AL,AH
        MUL     WordSize
        MOV     SI,AX
        LEA     BX,Hex
        MOV     DX,[BX+SI]
        POP     AX
        MUL     WordSize
        MOV     DI,AX
        LES     BX,[Long]
        NOT     DX
        AND     ES:[BX+DI],DX
Del  Endp;

Empty  proc ;assembler;
        MOV     AX,Max
        DIV     WordBit
        PUSH    AX
        XOR     AH,AH
        CMP     AX,0
        JZ      @4
        MOV     CX,AX
        LEA     SI,EmptySet
        LES     DI,[Long]
        CLD
        REPE    CMPSW
        JE      @4
        POP     AX
        JMP     @2
    @4:
        POP     AX
        MOV     CL,AH
        XOR     CH,CH
        INC     CX
        MUL     WordSize
        MOV     DI,AX
        LES     BX,[Long]
        MOV     DX,ES:[BX+DI]
        LEA     BX,Hex
    @5:
        MOV     AX,CX
        DEC     AX
        DIV     WordBit
        XCHG    AL,AH
        MUL     WordSize
        MOV     SI,AX
        TEST    DX,[BX+SI]
        LOOPZ   @5
        JNZ     @2
    @1:
        MOV     AL,1
        JMP     @3
    @2:
        MOV     AL,0
    @3:
Empty  Endp;

Fill  proc ;assembler;
        MOV     AX,Max
        DIV     WordBit
        INC     AL
        XOR     CX,CX
        MOV     CL,AL
        INC     CX
        MOV     AX,0FFFFh
        LES     DI,[Long]
        CLD
        REP     STOSW
Fill  Endp;
Mikl___ вне форума Ответить с цитированием
Старый 11.10.2010, 10:55   #5
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,162
По умолчанию

Код:
Full  proc ;assembler;
        MOV     AX,Max
        DIV     WordBit
        PUSH    AX
        XOR     AH,AH
        CMP     AX,0
        JZ      @4
        MOV     CX,AX
        LEA     SI,FullSet
        LES     DI,[Long]
        CLD
        REPE    CMPSW
        JE      @4
        POP     AX
        JMP     @2
    @4:
        POP     AX
        MOV     CL,AH
        XOR     CH,CH
        INC     CX
        MUL     WordSize
        MOV     DI,AX
        LES     BX,[Long]
        MOV     DX,ES:[BX+DI]
        LEA     BX,Hex
    @5:
        MOV     AX,CX
        DEC     AX
        DIV     WordBit
        XCHG    AL,AH
        MUL     WordSize
        MOV     SI,AX
        TEST    DX,[BX+SI]
        LOOPNZ  @5
        JZ      @2
    @1:
        MOV     AL,1
        JMP     @3
    @2:
        MOV     AL,0
    @3:
Full  Endp;

InThe  proc ;assembler;
        MOV     AX,Number
        DIV     WordBit
        PUSH    AX
        XCHG    AL,AH
        MUL     WordSize
        MOV     SI,AX
        LEA     BX,Hex
        MOV     DX,[BX+SI]
        POP     AX
        MUL     WordSize
        MOV     DI,AX
        LES     BX,[Long]
        TEST    DX,ES:[BX+DI]
        JZ      @1
        MOV     AL,1
        JMP     @2
    @1:
        MOV     AL,0
    @2:
InThe  Endp;
.data
Number dw ?
WordSize db ?
WordBit dw ?
Hex dw ?
Long dd ?
Long1 dd ?
Long2 dd ?
Max dw ?
FullSet dw ?
EmptySet dw ?
end start
слишком длинный текст поэтому в двух топиках
Mikl___ вне форума Ответить с цитированием
Старый 11.10.2010, 11:09   #6
tuition
Новичок
Джуниор
 
Регистрация: 11.10.2010
Сообщений: 3
По умолчанию

Спасибо.

Попробую встроить данный код в Delphi с учетом замечаний.
tuition вне форума Ответить с цитированием
Старый 10.12.2010, 14:59   #7
Robus
Новичок
Джуниор
 
Регистрация: 11.10.2010
Сообщений: 2
По умолчанию

Цитата:
Сообщение от tuition Посмотреть сообщение
Всем доброго времени суток.

Есть программа на Delphi которая использует вставку на assembler:

function Full;assembler;
Asm
...
TEST DX,[BX+SI] <<< Ошибка здесь
...
End;

Ошибка звучит следующим образом: Operand size mismatch.

Полный исходный pas файл прилагается.

Большая просьба помочь. Спасибо.
На сколько я понимаю, DELPHI у Вас 32-битовый !!! Тут, собственно, ключевое слово 32-BIT ... Соответственно везде адресация к памяти должна быть через 32-BIT регистры. Из этого следует что не BX а EBX ... Мало того 32-BIT режиме LOOP будет оперировать с ECX, а не с CX. Вообщем весь код нужно переписать ... Данный код был написан под 16-BIT режим, и вставлен в DELPHI, скорее всего из класического PASCAL'я.
В принципе команда TEST [SI] в 32-BIT'ном режиме не есть такой уж запрет, просто не рекомендуется, поскольку первое прерывание перед подобной командой может уничтожить напрочь точность адреса ... Допустим мы делаем так:
MOV BYTE PTR [12345678H],AL
MOV BX,0000H
MOV BYTE PTR [BX],AH
Если перед последней командой не произойдёт прерывание или по DS:ADDR ничего не прочитают/запишут, то AH попадёт по логическому адресу 12340000H. То есть, - нижние два байта адреса будут от BX, а верхние от последнего обращения к DS сегменту. Но данный код не употребим в современном мире кодинга, ибо на нижнем уровне крутятся всякие ОСи, которые никогда не будут давать запущенному приложению 100% доступа к процессору, максимум PROTECT-MODE c FLAT MEMORY, но в лучшем случае REAL-MODE. Поэтому Delphi по своей честности может не ругнуться да же на команду MOV AL,[BX].
Robus вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Набрать номер по модему. Различие в реализации кода Delphi 2007 и 2010. plato Общие вопросы Delphi 8 06.04.2010 09:47
Ошибка кода при компиляции rubik Общие вопросы C/C++ 0 22.03.2010 19:44
Ошибка при написании ассемблеровского кода на Визе 6.0 Познающий Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 03.11.2009 19:09
Ошибка На Indy SMTP в Delphi 2007 combays Помощь студентам 1 22.03.2009 03:08
Ошибка при запуске Excel 2007 mirawoo Microsoft Office Excel 10 18.11.2008 16:11