Задача состоит в манипуляции с элементами массива. Для начала накидал тестовый вариант программы: include \masm32\include\masm32rt.inc .data array db 1,2,3,4,5 .code start: call main inkey exit main proc LOCAL temp : DWORD mov esi, offset array ; адрес начала массива mov eax, [esi+0] ; берём 0-ый элемент массива mov temp, eax ; нулевой элемент массива в переменную temp ; далее вставляю Debug Message Box: pushad fn MessageBox,0,str$(temp),"Test",MB_OK popad ret main endp end start В результате в Message Box-е появляется восьмизначное число, хотя по-идее должна быть 1. Может каким-то иным образом можно контролировать значения ячеек массива на стадии выполнения, т.е. вывести на экран исходный массив и обработанный?
Дело в том что бинарное число само по себе не является строкой. Нужна функция wsprintf() из Win API. Сделай текстовый буфер (байтов 16) и что-то в этом роде: Код (Text): .data format db '%d',0 ... invoke wsprintfA, buffer, format, temp А затем уже передавай адрес буфера с числом вместо str$(temp).
AsmGuru62 макрос str$ как раз и преобразует число в строку и если раньше он был переходником к wsprintf то теперь там вполне путный асм код dzga У тебя массив из байт читается dword-ами вот и полчается четыре числа в одном
Массив из байт начал читать word-ами - работа программы прекращена, Windows пытается найти способ устранения этой ошибки Пробовал даже объявить temp как byte, а вместо ax использовать al - тоже самое (вылет в Windows) include \masm32\include\masm32rt.inc .data array db 1,2,3,4,5 .code start: call main inkey exit main proc LOCAL temp : WORD mov esi, offset array ; адрес начала массива mov ax, [esi+0] ; берём 0-ой элемент массива mov temp, ax ; нулевой элемент массива в переменную temp ; далее вставляю Debug Message Box: pushad fn MessageBox,0,str$(temp),"Test",MB_OK popad ret main endp end start
Код (Text): ; для беззнаковых: movzx eax, byte ptr [esi] mov [temp], eax ; или xor eax, eax mov al, [esi] mov [temp], eax ; или mov al, [esi] and eax, 0FFh mov [temp], eax ; или mov eax, [esi] and eax, 0FFh mov [temp], eax ; для знаковых: movsx eax, byte ptr [esi] mov [temp], eax ; можно сразу movzx eax, byte ptr [esi] fn MessageBox, 0, str$(eax), "Test", MB_OK wsprintf удобна тем что позволяет добавлять сопровождающий текст.