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

さて、これが問題です:

私の推測では、WriteInt は EAX で 32 ビットの符号付きの値を想定しています。したがって、次のことができます。

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
于 2010-02-16T19:46:58.803 に答える
0
含む Irvine32.inc
。データ
myArray BYTE 10、20、30、40、50、60、70、80、90、100

。コード
メイン PROC
    Clrscr を呼び出す
    移動esi、OFFSET myArray
    mov ecx、LENGTHOF myArray
    xor eax、eax
L1:
    add eax, byte ptr [esi]
    inc esi
    ループ L1
    WriteInt を呼び出す
    出口
メインENDP
ENDメイン

レジスタWriteInt内のデータへのオフセットへの 32 ビット ポインタを使用していたためにコードが失敗したため、EAX でパラメータを取得して結果を出力すると仮定しています。適切な 8 ビットを取得するには、それを a に変更します。 (バイト)。また、の使用はレジスタの命令よりも高速であり、コードは機能するはずです...ESIbyte ptrXORMOVEAX

これがお役に立てば幸いです。よろしくお願いします、トム。

于 2010-02-16T20:12:03.770 に答える