Topic: Error A2026: constant expected (Read 14580 times)
Hyzau
Hi,
Once again, sorry for disturbing you
I’m having the following syntax which I want to translate in MASM
movzx eax , word [(ebx-1)*2+eax]
I’ve tried many things but I can’t figure out what syntax should I use in masm
mov eax, 2
mov dwSave, ebx
sub dwSave, 1
mul dwSave ; I can't alter ebx, i need it later so I put it in "dwSave dd 0"
[Doing some change on eax]
add eax, dwSave ; so eax = (ebx - 1) * 2 + eax
movzx eax, [eax] ; error A2070: invalid instruction operands
movzx eax, word [eax] ; error A2009: syntax error in expression // Yeah I know that it was wrong but tried it anyway ><
movzx eax, word ptr [eax] ; seems to doesn't give the right value
By the way, the original code is NASM.
Thanks in advance for your help.
Best regards,
Logged
Hyzau
Okay,
movzx eax, word ptr [eax]
May be the right solution ^^. However, it doesn’t work for me because I’m loosing EDX during the MUL…
If you have a working syntax which don’t force me to use MUL it could be great.
Logged
Use movzx eax, word ptr [2*ebx+eax-2]
Welcome to the Forum :icon14:
Logged
« Last Edit: February 25, 2022, 05:47:43 AM by nidud »
Logged
Hyzau
Use movzx eax, word ptr [2*ebx+eax-2]
Welcome to the Forum :icon14:
Well thanks a lot
It’s kinda simpler than my all my stuff.
I’ve was searching a solution for hours now and I didn’t thought about brackets ><
Logged
The push/pop works but is kind of slow, at least on my CPU:
Intel(R) Celeron(R) M CPU 420 @ 1.60GHz (SSE3)
loop overhead is approx. 189/100 cycles
124 cycles for 100 * movzx JJ
226 cycles for 100 * push nidud
12 bytes for movzx JJ
17 bytes for push nidud
29811 = eax movzx JJ
29811 = eax push nidud
Logged
I am completely newbie in masm32 and I want to realize such idea which is described in following line of (incorrect) code :
mov ebx,(eax mod any_number)
Compiler gives me error A2026 : constant expected
I read that mod operation cannot be used between registers, so which methods will help me to perform same idea ?
Hope for your help.
asked Jan 23, 2012 at 12:30
1
9 % 5 = 4
What does Modulus mean? It is the remainder after you divide 2 numbers
mov eax, 9 mod 5
or
xor edx, edx
mov eax, 9
mov ecx, 5
div ecx
now edx contain the Modulus
answered Jan 24, 2012 at 3:51
GunnerGunner
5,7222 gold badges24 silver badges39 bronze badges
I would like to use my answer to exercise 2.b of the book Guide to Assembly Language: A Concise Introduction by James T. Streib,
;result = number % amount
mov eax,number
cdq ;copy or propagate the sign bit into the edx register
idiv amount
mov result,edx ;the remainder in the edx register and the
;quotient in the eax register
answered May 16, 2020 at 19:56
-
Mikl___
Супермодератор
Команда форума- Публикаций:
-
14
- Регистрация:
- 25 июн 2008
- Сообщения:
- 3.468
Стандартная реализация ALIGN ЧИСЛО в MASM предполагает заполнение от метки ALIGN_ЧИСЛО до адреса кратного ЧИСЛО кодом 90h, а если требуется заполнение, например нулями? В теории это должно выглядеть вот так
-
db ((-$) and 11b) dup (0); align 4
а на практике эта конструкция приводит к выдаче ошибки
error A2026: constant expected
Как правильно это выглядит на масм? -
FatMoon
New Member
- Публикаций:
-
0
- Регистрация:
- 28 ноя 2002
- Сообщения:
- 954
- Адрес:
- Russia
Чего-то меня сомнения гложут. Если align в секции данных, оно нулями и заполняло всегда. Если в коде — то естественно нопами. Как-то не заострял на этом внимания, но вроде бы так. И это меня устраивало на 100%
-
Mikl___
Супермодератор
Команда форума- Публикаций:
-
14
- Регистрация:
- 25 июн 2008
- Сообщения:
- 3.468
FatMoon
не обращал внимание на align в секции данных, но у меня секция кода объединена с секцией данных и секцией импорта (вот такой я извращенец!), но всё-же, как написать рабочую конструкцию типа этой-
db ((-$) and 11b) dup (0)
на масме без «error A2026: constant expected»?
-
valterg
Active Member
- Публикаций:
-
0
- Регистрация:
- 19 авг 2004
- Сообщения:
- 2.105
ALIGN aligns ……………………….
…………………………………..
In a segment containing no instructions, the assembler pads eachskipped byte with nulls (00h). In a code segment, the assembler
inserts a no-operation sequence (not necessarily NOP instructions)
to fill the gap. -
s_d_f
New Member
- Публикаций:
-
0
- Регистрация:
- 15 май 2008
- Сообщения:
- 342
Если секция кода начинается с метки start
-
db (512-(($-offset start) mod 512)) dup(0CCh)
-
Mikl___
Супермодератор
Команда форума- Публикаций:
-
14
- Регистрация:
- 25 июн 2008
- Сообщения:
- 3.468
Rockphorr
спасибо, но, к сожалению, код вашего примера выдает следующие ошибки-
error A2006: undefined symbol a
-
error A2026: constant expected
конструкция s_d_f рабочая, вот ее «косметическая» доработка
-
db ((start — $) and 511) dup(0CCh)
Спасибо всем кто откликнулся!
DessanM 1 / 1 / 0 Регистрация: 16.10.2019 Сообщений: 81 |
||||||||
1 |
||||||||
Ошибка компиляции исходника из книги Кипа Ирвина21.05.2021, 23:35. Показов 1843. Ответов 14 Метки нет (Все метки)
Попробуйте научиться запускать в отладчике или симуляторе одну инструкцию машины, например, CPUID ( 0F A2 ) Если б я мог хоть что-то внятное запустить)))))))После долгих мучений и миллиона видео на youtube не вызывает ошибку вот такой код:
и вот такой код:
Выполняется с ошибками: E0020 идентификатор «include» не определен MASM F:ASSEMBLERMASMMain.asm 1 И только с регистром EDX, a EAX, EBX, ECX выводят какой-то 1 разный символ мусора. Почему выполняются оба кода,почему один ошибки выводит а второй нет, какой вариант шаблона использовать — понятия не имею. Добавлено через 39 секунд
__________________
0 |
DessanM 1 / 1 / 0 Регистрация: 16.10.2019 Сообщений: 81 |
||||||||
22.05.2021, 00:04 [ТС] |
2 |
|||||||
еще у меня компилируется вот такой код чрез командную строку
И он же только с прописанными путями в Visual Studio
выводит ошибки: Ошибка A2026 constant expected MASM C:masm32includewinextra.inc 11052
0 |
Модератор 1763 / 866 / 157 Регистрация: 23.07.2018 Сообщений: 2,941 Записей в блоге: 3 |
|
22.05.2021, 00:30 |
3 |
Не видя упомянутые в сообщениях файлы, остаётся только гадать.
0 |
ФедосеевПавел Модератор 8278 / 4182 / 1595 Регистрация: 01.02.2015 Сообщений: 13,004 Записей в блоге: 3 |
||||
22.05.2021, 00:57 |
4 |
|||
Начнём с того, что примеры в книге Кипа Ирвина предполагается компилировать пакетным файлом следующего содержания
Фишка в объявлении специальных переменных среды окружения Include и Lib, а также в добавлении пути к ml и link в переменную PATH. Тут уж как работаете — из пакетника или из VS. Не обращайте внимания, найдите рабочую конфигурацию и занимайтесь ассемблером, а не системными деталями.
0 |
1 / 1 / 0 Регистрация: 16.10.2019 Сообщений: 81 |
|
22.05.2021, 01:22 [ТС] |
5 |
Фишка в объявлении специальных переменных среды окружения Include и Lib, а также в добавлении пути к ml и link в переменную PATH. Он может и предлагает, но я такое вижу впервые. В роликах компилируют ml /c /Zd /coff «file.asm» — делает obj дайте хоть начать что-то нормально запускать из ассемблера)Куда мне в bat лезть еще.
Не обращайте внимания, найдите рабочую конфигурацию и занимайтесь ассемблером, а не системными деталями. Я б с радостью, но не получается. Хотелось бы чтоб всё работало через Visual Studio (не Visual Studio Code). politoto, и у Вас может есть какие-то примеры посложнее на ассемблере
0 |
Модератор 1763 / 866 / 157 Регистрация: 23.07.2018 Сообщений: 2,941 Записей в блоге: 3 |
|
22.05.2021, 03:34 |
6 |
DessanM, заметно посложнее: в дистрибутивах FASM’а для разных платформ есть исходники самого FASM’а, из которых FASM может собрать сам себя.
0 |
DessanM 1 / 1 / 0 Регистрация: 16.10.2019 Сообщений: 81 |
||||||||
22.05.2021, 11:53 [ТС] |
7 |
|||||||
DessanM, заметно посложнее: в дистрибутивах FASM’а для разных платформ есть исходники самого FASM’а, из которых FASM может собрать сам себя. А если серьёзно? Добавлено через 28 минут Добавлено через 2 часа 18 минут
А вот этот код, который почти как С++ и без mov и прерываний, который мне не нравится потому что, я хочу именно прописывать каждый регистр, каждый байт сам, а здесь всего этого не наблюдается, как раз для виндоус:
А я уже который день пытаюсь скомпилировать код под DOS, который мне очень сильно нравится и я хочу его изучить, для виндоус и запустить его и ищу в интернете почему у меня ничего не получается и создаю разные темы на форуме?
0 |
ФедосеевПавел Модератор 8278 / 4182 / 1595 Регистрация: 01.02.2015 Сообщений: 13,004 Записей в блоге: 3 |
||||
22.05.2021, 17:38 |
8 |
|||
РешениеДа, один код для DOS, другой для Windows. Не теряйте время на DOS, сразу учите Windows. Консольные программы для Windows выглядят почти, как аналогичные для DOS. Сам работаю в редакторе SciTE, компиляцию и отладку запускаю пакетными (bat) файлами.
2 |
politoto Модератор 1763 / 866 / 157 Регистрация: 23.07.2018 Сообщений: 2,941 Записей в блоге: 3 |
||||
22.05.2021, 22:59 |
9 |
|||
я уже который день пытаюсь скомпилировать код под DOS, который мне очень сильно нравится Код использует устаревшие возможности старого языка, которые в современном ассемблере отключены за ненадобностью. Но ассемблировать его современным ml.exe в Developer PowerShell for VS 2019 мне сегодня удалось:
Microsoft (R) Macro Assembler Version 14.28.29913.0 Assembling: hw.asm Код Microsoft (R) Macro Assembler Version 14.28.29913.0 05/22/21 20:20:20 hw.asm Page 1 - 1 .model small .stack 200 0000 .data 0000 48 65 6C 6C 6F 2C Hello byte "Hello, world!$" 20 77 6F 72 6C 64 21 24 0000 .code 0000 B8 ---- R start: mov ax,@data 0003 8E D8 mov ds,ax 0005 B4 09 mov ah,9 0007 BA 0000 R mov dx,offset Hello 000A CD 21 int 21h 000C B4 00 mov ah,0 000E CD 16 int 16h 0010 B4 4C mov ah,4Ch 0012 CD 21 int 21h end start Код Microsoft (R) Macro Assembler Version 14.28.29913.0 05/22/21 20:20:20 hw.asm Symbols 2 - 1 Segments and Groups: N a m e Size Length Align Combine Class DGROUP . . . . . . . . . . . . . GROUP _DATA . . . . . . . . . . . . . 16 Bit 000E Word Public 'DATA' STACK . . . . . . . . . . . . . 16 Bit 00C8 Para Stack 'STACK' _TEXT . . . . . . . . . . . . . 16 Bit 0014 Word Public 'CODE' Symbols: N a m e Type Value Attr @CodeSize . . . . . . . . . . . Number 0000h @DataSize . . . . . . . . . . . Number 0000h @Interface . . . . . . . . . . . Number 0000h @Model . . . . . . . . . . . . . Number 0002h @code . . . . . . . . . . . . . Text _TEXT @data . . . . . . . . . . . . . Text DGROUP @fardata? . . . . . . . . . . . Text FAR_BSS @fardata . . . . . . . . . . . . Text FAR_DATA @stack . . . . . . . . . . . . . Text DGROUP Hello . . . . . . . . . . . . . Byte 0000 _DATA start . . . . . . . . . . . . . L Near 0000 _TEXT 0 Warnings 0 Errors без ошибок и предупреждений, в результате получился 166-байтный объектый файл: Кликните здесь для просмотра всего текста Код 00000000 80 08 00 06 68 77 2e 61 73 6d 24 96 2b 00 00 05 |....hw.asm$.+...| 00000010 53 54 41 43 4b 05 5f 44 41 54 41 06 44 47 52 4f |STACK._DATA.DGRO| 00000020 55 50 05 5f 54 45 58 54 05 53 54 41 43 4b 04 44 |UP._TEXT.STACK.D| 00000030 41 54 41 04 43 4f 44 45 0e 98 07 00 48 14 00 05 |ATA.CODE....H...| 00000040 08 01 f7 98 07 00 48 0e 00 03 07 01 00 98 07 00 |......H.........| 00000050 74 c8 00 02 06 01 1c 9a 06 00 04 ff 02 ff 03 59 |t..............Y| 00000060 a0 12 00 02 00 00 48 65 6c 6c 6f 2c 20 77 6f 72 |......Hello, wor| 00000070 6c 64 21 24 9f a0 18 00 01 00 00 b8 00 00 8e d8 |ld!$............| 00000080 b4 09 ba 00 00 cd 21 b4 00 cd 16 b4 4c cd 21 3f |......!.....L.!?| 00000090 9c 0a 00 c8 01 55 01 c4 08 14 01 02 58 8a 06 00 |.....U......X...| 000000a0 c1 50 01 00 00 5e |.P...^| 000000a6 Добавлено через 44 минуты
Правильно ли до меня дошло, что вот этот код … только для DOS и под виндоус его не запустить: То, что код предназначен для MS-DOS ( при чём в момент создания использовал уже несколько устаревшую функцию ) и подобных систем — верно.
exe файл перетаскивают в консоль винды и делается debug с наглядным кодом, что мне очень понравилось. Но те уроки выполнялись на виртуальной машине под 32 битную виндоус. Возможность выполнения приложений, разработанных для MS-DOS, была предусмотрена в Windows NT с самого начала, при чём даже на аппаратных платформах, не совместимых с x86 (i386). Это было требованием бизнеса того времени. В наше время появилась потребность выполнять в Windows приложения, разработанные для linux, без перекомпиляции и лишней возни. И такая возможность есть и развивается в Windows 10 уже не первый год.
1 |
1 / 1 / 0 Регистрация: 16.10.2019 Сообщений: 81 |
|
23.05.2021, 08:39 [ТС] |
10 |
ФедосеевПавел, вот это то что нужно!Это то что я искал! Сразу выводы: мне б еще содержимое bat файла и вообще прекрасно
Но ассемблировать его современным ml.exe в Developer PowerShell for VS 2019 мне сегодня удалось Классно, а у меня не получилось, хотя есть целых 2 ml.exe; ASM Visual и Visual Studio, не запустился файл. А я бы очень хотел наглядно видеть как записываются байты в память и там изменяются.
То, что под виндоус его не запустить — неверно. Я мою 64 разрядную имел в виду. В общем спасибо, наконец-то я знаю с чего начинать)
0 |
Модератор 1763 / 866 / 157 Регистрация: 23.07.2018 Сообщений: 2,941 Записей в блоге: 3 |
|
23.05.2021, 13:55 |
11 |
Я мою 64 разрядную имел в виду. Если понадобится, то в Вашей системе тоже можно запускать программы для FreeDOS
я бы очень хотел наглядно видеть как записываются байты в память и там изменяются. Чтобы это наглядно увидеть, ASMы не нужны. Кстати, для DOSBOX тоже есть штатная программа-монитор, позволяющая просматривать и изменять содержимое регистров и памяти виртуальной машины, останавливать «зависшую» машину, чтобы посмотреть, где зациклилась программа и т.д. Добавлено через 4 часа 34 минуты
код, где много mov и прерываний, только для DOS В коде Windows 10 на самом деле тоже хватает Код NtTerminateProcess: 00007FFD6084D390 4C 8B D1 mov r10,rcx 00007FFD6084D393 B8 2C 00 00 00 mov eax,2Ch 00007FFD6084D398 F6 04 25 08 03 FE 7F 01 test byte ptr [7FFE0308h],1 00007FFD6084D3A0 75 03 jne NtTerminateProcess+15h (07FFD6084D3A5h) 00007FFD6084D3A2 0F 05 syscall 00007FFD6084D3A4 C3 ret 00007FFD6084D3A5 CD 2E int 2Eh 00007FFD6084D3A7 C3 ret В отличие от linux,
1 |
6681 / 2664 / 366 Регистрация: 17.02.2013 Сообщений: 3,906 |
|
17.06.2021, 14:19 |
12 |
Возможность выполнения приложений, разработанных для MS-DOS, была предусмотрена в Windows NT с самого начала, при чём даже на аппаратных платформах, не совместимых с x86 (i386). Это на каких таких платформах ? Почему не знаю ?
0 |
Модератор 1763 / 866 / 157 Регистрация: 23.07.2018 Сообщений: 2,941 Записей в блоге: 3 |
|
17.06.2021, 15:52 |
13 |
Первоначально на MIPS и DEC Alpha. Позже добавились PowerPC, Itanium, а MIPS ушёл первым, если я не ошибаюсь.
0 |
6681 / 2664 / 366 Регистрация: 17.02.2013 Сообщений: 3,906 |
|
17.06.2021, 17:39 |
14 |
Каким чудом ты на DEC Alpha исполнишь приложение, разработанное для MS-DOS ? То бишь COM или EXE. Аналогично про MIPS и прочий шмипс.
0 |
Модератор 1763 / 866 / 157 Регистрация: 23.07.2018 Сообщений: 2,941 Записей в блоге: 3 |
|
17.06.2021, 18:31 |
15 |
Там же написано: Microsoft купила права на использование этого программного чуда у Insignia Solutions
0 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
17.06.2021, 18:31 |
Помогаю со студенческими работами здесь Как подготовить выборку для проверки методом Ирвина Сравнить ФИО из книги 1 и книги 2, и если совпадают, то в столбец А книги 1, подставить данные из столбца В книги 2 Delphi 10.3 (win 10/64) комьюнити Ошибка программы на Win XP из скомпилированного из исходника Делфи 7
Ошибка при компиляции. Где ошибка? (Работа с классом)
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: 15 |
I use for the first time your masm compiler. The installation was succeded.
I want to make a 4k demo only in assembler. I choose the tiny memory mode. Unfortunately each of my compilation failed .
So I decided to compile a example program I found on the Web. However that doesn’t work .
Here the example assembler listing (the compiled example binary is a .com) :
mov al, 13h
int 10h
push cs
pop ds
mov si, offset datas
push 0a000h
pop es
@otro_frame:
inc word ptr lx
inc word ptr camx
xor di, di
mov word ptr j, -100
@otra_linea:
mov cx,320
push word ptr camx
pop word ptr i
@otro_punto:
fild word ptr i
fmul st(0),st(0) ; iэ
fild word ptr j
fmul st(0), st(0) ; jэ
fild word ptr d
fmul st(0), st(0) ; dэ
faddp st(1),st(0)
faddp st(1),st(0) ; a
fild word ptr d ; d
fimul word ptr prof ; Prof. de la camara
fadd st(0), st(0)
fild word ptr prof ; Prof. de la camara
fmul st(0),st(0)
fisub word ptr r2 ; rэ
fld st(0)
fmul st(0),st(3)
fadd st(0),st(0)
fadd st(0),st(0) ; 4 a c
fld st(2)
fmul st(0),st(0) ; bэ
fsub st(0),st(1) ; disc = bэ — 4 a c
ftst
fstsw ax
sahf
mov ax,bx
jc Pinta
fld st(4)
fadd st(0), st(0) ; 2 a
fldz
fsub st(0), st(5)
fsub st(0), st(2) ; — b — sqrt(disc)
fdiv st(0), st(1) ; ( — b — sqrt(disc) ) / (2 a)
fstp dword ptr t
finit
fld dword ptr t ; st(0) = t
fild word ptr i ; i
fmul st(0), st(1)
fild word ptr j ; j
fmul st(0), st(2)
fild word ptr d ; d
fmul st(0), st(3)
fiadd word ptr prof ; Prof.
; Ahora st(0) = z
; st(1) = y
; st(2) = x
; st(3) = t
fld st(2)
fisub word ptr lx
fld st(2)
fisub word ptr ly
fld st(2)
fisub word ptr lz
fld st(0)
fmul st(0),st(0)
fld st(2)
fmul st(0),st(0)
faddp st(1),st(0)
fld st(3)
fmul st(0),st(0)
faddp st(1),st(0)
fsqrt
fimul word ptr r
fld st(1)
fmulp st(5),st(0)
fld st(2)
fmulp st(6),st(0)
fld st(3)
fmul st(0),st(7)
fadd st(0),st(5)
fadd st(0),st(6)
fdiv st(0), st(1)
fimul word ptr rango
fabs
fistp word ptr t
mov al, t
Pinta:
stosb
inc word ptr i
dec cx
jnz @otro_punto
inc word ptr j
cmp byte ptr j, 100
jne @otra_linea
cmp byte ptr camx + 1, 1
je exit
in al, 60h
dec ax
jnz @otro_frame
exit:
mov al, 3h
int 10h
prof = [si+$-offset datas]
dw -40 ; Prof. de la camara
r2 = [si+$-offset datas]
d = r2
dw 225 ; rэ
r = [si+$-offset datas]
rango = r
dw 15
lx = [si+$-offset datas]
ly = [si+$-offset datas+2]
lz = [si+$-offset datas+4]
dw -250,-100,-400 ; Luz
camx = [si+$-offset datas]
dw -425
j = [si+$-offset datas]
i = [si+$-offset datas + 2]
t = [si+$-offset datas + 4]
I type the command :
(I’m really sorry to flood on this topic but I do NOT understand what’s wrong . )
That’s not the only case : the majority of assembler listing example from a book can’t compile.
Can anybody help me ?
#37 -x[reg] syntax
Status:
closed
Owner:
nobody
Labels:
None
Priority:
5
Updated:
2009-09-14
Created:
2009-07-10
Private:
No
The folowing syntax gets error message:
Error! E077: A constant operand is expected after a negative sign
mov word ptr -28[ebp],81E1h ; Condition prefix flags
The following doesn’t get an error:
mov word ptr [ebp-28],81E1h ; Condition prefix flags
The first syntax works fine using ALP. I don’t have MASM to test with.
Discussion
-
Masm displays:
CODE202.ASM(7) : error A2026: constant expectedwhat works with both jwasm and masm is:
mov word ptr [-28][ebp], 81E1h
because the [] is a synonym for the + operator in masm syntax.
japheth
-
It’s amazing how much ALP and MASM differ. I thought they were compatible, but apparently only upwardly-compatible. If I ever get some time (ha!) I’ll look at the source with an eye towards putting in support for ALP features with a command-line argument.
-
- status: open —> closed
Log in to post a comment.