![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Новичок
Джуниор
Регистрация: 11.10.2010
Сообщений: 3
|
![]()
Всем доброго времени суток.
Есть программа на 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 файл прилагается. Большая просьба помочь. Спасибо. |
![]() |
![]() |
![]() |
#2 |
Участник клуба
Регистрация: 11.01.2010
Сообщений: 1,139
|
![]()
tuition
попробуй так TEST DX,word ptr [BX+SI] |
![]() |
![]() |
![]() |
#3 |
Новичок
Джуниор
Регистрация: 11.10.2010
Сообщений: 3
|
![]() |
![]() |
![]() |
![]() |
#4 |
Участник клуба
Регистрация: 11.01.2010
Сообщений: 1,139
|
![]()
tuition
Вот текст твоей программы переведенной на ассемблер, как всё это должно работать не знаю, но компилируется без ошибок, кстати в ассемблере для возврата из процедуры требуется команда RET проблема скорре в том что не обявлены переменные Number, WordSize, WordBit, Hex, Long, Long1, Long2, Max, FullSet, EmptySet и их тип word, byte, long Код:
|
![]() |
![]() |
![]() |
#5 |
Участник клуба
Регистрация: 11.01.2010
Сообщений: 1,139
|
![]() Код:
|
![]() |
![]() |
![]() |
#6 |
Новичок
Джуниор
Регистрация: 11.10.2010
Сообщений: 3
|
![]()
Спасибо.
Попробую встроить данный код в Delphi с учетом замечаний. |
![]() |
![]() |
![]() |
#7 | |
Новичок
Джуниор
Регистрация: 11.10.2010
Сообщений: 2
|
![]() Цитата:
В принципе команда 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]. |
|
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Набрать номер по модему. Различие в реализации кода 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 |