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
4

4 回答 4

4

您必须将值转换为字节指针而不是 32 位指针。

改变

add eax, [esi]

add eax, byte ptr [esi]
于 2010-02-03T06:50:41.770 回答
1

您正在尝试从字节表中获取 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.
(...)
于 2010-02-03T14:20:09.303 回答
0

Okay here's the thing:

My guess is that WriteInt expects a 32-bit signed value in EAX. Therefore you could do:

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

loop L1 
-- or --
dec ecx
jnz L1

Or if you are sure that WriteInt do not touch EAX you can do:

xor eax,eax ; clear EAX
L1:
lodsb ; loads a byte into AL and increments ESI for you
call WriteInt
loop L1
于 2010-02-16T19:46:58.803 回答
0
包括 Irvine32.inc
。数据
myArray BYTE 10、20、30、40、50、60、70、80、90、100

。代码
主进程
    调用 Clrscr
    mov esi, 偏移 myArray
    mov ecx, LENGTHOF myArray
    xor eax, eax
L1:
    添加 eax,字节 ptr [esi]
    公司
    循环 L1
    调用 WriteInt
    出口
主要ENDP
结束主

我假设,WriteInt在 EAX 中使用参数来打印结果,因为代码失败,因为您使用 32 位指针指向ESI寄存器内数据的偏移量,将其更改为 abyte ptr以获得正确的 8 位(一个字节)。此外,使用XOR将比寄存器MOV指令更快EAX,那么代码应该可以工作......

希望这会有所帮助,最好的问候,汤姆。

于 2010-02-16T20:12:03.770 回答