2010-02-03 3 views
1

http://imgur.com/gjUbV.jpgЧто я делаю неправильно? (Простая монтажная петля)

Это не позволит мне опубликовать фотографию. Кстати, кто-то из Reddit.programming отправил меня сюда. Так что спасибо!

TITLE MASM Template 

; Description 
; 
; Revision date: 

INCLUDE Irvine32.inc 
.data 
myArray BYTE 10, 20, 30, 40, 50, 60, 70, 80, 90, 100 

.code 
main PROC 
    call Clrscr 
    mov esi, OFFSET myArray 
    mov ecx, LENGTHOF myArray 
    mov eax, 0 
L1: 
    add eax, [esi] 
    inc esi 
    loop L1 
    call WriteInt 
    exit 
main ENDP 
END main 

Результаты в:

-334881242
+0

Можете ли вы разместить код? Я едва могу разобраться. –

+1

Я не вижу ничего явно неправильного. Может быть, ваша функция 'WriteInt' должна находиться внутри цикла? И убедитесь, что он только печатает значение одного байта, потому что кажется, что он печатает 32-битное значение. – AndiDog

+0

http://i.imgur.com/gjUbV.jpg Это полное изображение. Я сильно взорваюсь – sunnyohno

ответ

4

Вы должны бросить значение байта указателя вместо 32 битного указателя.

Изменить

add eax, [esi] 

в

add eax, byte ptr [esi] 
+0

Это не сработает: ** ошибка A2022: операнды команд должны быть одного размера ** – rkhb

1

Вы пытаетесь получить DWORD из таблицы байтов, поэтому MASM дает вам размер error.Forcing байт здесь с помощью BYTE PTR собирается получить вы masm error (недопустимый операнд или что-то подобное), потому что вы не можете напрямую добавить байт в DWORD.

Но есть еще несколько способов сделать то, что вы хотите. Вот один, который стоит дополнительный регистр (EDX):

(...) 
    mov edx, 0   ; We want the upper 3 bytes to zero. 
    mov eax, 0 

L1: 
    mov dl, [esi]  ; Inject one byte from the table, 
    add eax, edx  ; upper bytes still zero, so EDX has your byte value. 
(...) 
0

Хорошо вот вещь:

Я думаю, что WriteInt ожидает 32-разрядное значение в EAX. Таким образом, вы можете сделать:

movzx eax, BYTE PTR [esi] 
inc esi 
call WriteInt 

loop L1 
-- or -- 
dec ecx 
jnz L1 

Или, если вы уверены, что WriteInt не трогают EAX вы можете сделать:

xor eax,eax ; clear EAX 
L1: 
lodsb ; loads a byte into AL and increments ESI for you 
call WriteInt 
loop L1 
0
 
INCLUDE Irvine32.inc 
.data 
myArray BYTE 10, 20, 30, 40, 50, 60, 70, 80, 90, 100 

.code 
main PROC 
    call Clrscr 
    mov esi, OFFSET myArray 
    mov ecx, LENGTHOF myArray 
    xor eax, eax 
L1: 
    add eax, byte ptr [esi] 
    inc esi 
    loop L1 
    call WriteInt 
    exit 
main ENDP 
END main 

Я предполагаю, WriteInt принимает параметр в EAX для распечатайте результаты, так как код не удался, потому что вы использовали 32-битный указатель на смещение в данные в регистре ESI, измените его на byte ptr, чтобы получить правильные 8 бит (байт). Кроме того, использование XOR будет быстрее, чем MOV инструкции для EAX регистра, то код должен работать ...

Надеется, что это помогает, С наилучшими пожеланиями, Том.

+0

'add eax, byte ptr [esi]' будет вызывать ошибку: ошибка A2022: операнды команд должны быть одного размера – rkhb

Смежные вопросы