Что я делаю неправильно? (Простой монтажный цикл) - PullRequest
1 голос
/ 03 февраля 2010

http://imgur.com/gjUbV.jpg

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

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

Ответы [ 4 ]

4 голосов
/ 03 февраля 2010

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

Изменить

add eax, [esi]

до

add eax, byte ptr [esi]
1 голос
/ 03 февраля 2010

Вы пытаетесь получить DWORD из таблицы байтов, поэтому masm выдает ошибку. Принудительное использование размера байта здесь с помощью BYTE PTR приведет к ошибке masm (недопустимый операнд или что-то подобное), потому что вы не можете напрямую добавьте байт в 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 голосов
/ 16 февраля 2010
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 голосов
/ 16 февраля 2010

Хорошо, вот в чем дело:

Я предполагаю, что 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...