Сохранить многобайтовую символьную константу в байтовом массиве MASM? - PullRequest
0 голосов
/ 11 ноября 2019

Я пытаюсь написать простую процедуру, которая назначит буквенную оценку строковой переменной на основе оценки, введенной пользователем, которую я сохранил в переменной с именем "AGrade". Я написал следующие заявления:

     LGrade proc AGrade;dword ; 1 Parameter 
    .if (AGrade > -1) && (AGrade<60)
    mov letter, "F"
    .EndIf

     .if (AGrade > 66) && (AGrade<70) 
    mov letter, "D+" ;ERROR SHOWS HERE
    .Endif

letter объявлено как letter byte " ", NULL

Я получаю сообщение об ошибке:

 error A2070: invalid instruction operands

Я заметил, что когдая полностью удаляю второе утверждение if, я могу построить без проблем. Так что я думаю, что я вкладываю неправильно. Вместо этого требуется «еще»? Если возможно, может кто-нибудь показать мне правильный путь, которым я бы вложил эти два утверждения? Большое спасибо!

1 Ответ

0 голосов
/ 11 ноября 2019

.if не имеет ничего общего с вашей ошибкой, посмотрите, в какой строке он находится.

"D+" - это не один байт, но ваш letter - это массив byte, которыйMASM магически ассоциируется с размером байтового операнда.

Возможно, вам необходимо mov word ptr letter, "+D", чтобы соответствовать размеру операнда для вашего 2-байтового хранилища.

См. При использовании мнемоники MOV длязагрузить / скопировать строку в регистр памяти в MASM, символы хранятся в обратном порядке? MASM странно относится к многосимвольным константам, поэтому вам нужно обратить их в источнике по сравнению с порядком, который вы хотите сохранить в памяти. (В отличие от хороших ассемблеров, таких как NASM, MASM обращал байты от источника, когда они помещались в непосредственную константу.)

...