1

私はアセンブリを使用してビジュアルスタジオ2005で作業しています(私は初心者です)。そのルールで算術累進を計算するプログラムを作成したいと思います: A n = 2*A n-1 + A n-2 but. レジスタの操作方法が本当にわかりません。演習を続けるには、例を 1 つだけ挙げてください。

これは私のコードです:

.386
.MODEL flat,stdcall

.STACK 4096

extern ExitProcess@4:Near

.data                               
arraysize DWORD 10

setarray  DWORD 0 DUP(arraysize)
firstvar  DWORD 1
secondvar DWORD 2

.code                               
_main:                              
mov eax,[firstvar]
mov [setarray+0],eax        
mov eax,[secondvar]
mov [setarray+4],eax

mov ecx, arraysize              ;loop definition
mov ax, 8

Lp:
mov eax,[setarray+ax-4]
add eax,[setarray+ax-4]
add eax,[setarray+ax-8]
mov [setarray+ax],eax

add ax,4;
loop Lp

add ax,4;

    push    0                   ;Black box. Always terminate
    call    ExitProcess@4       ;program with this sequence

    end   _main              ;End of program. Label is the entry point.
4

3 に答える 3

1

ax をインデックス レジスタとして、eax をデータ レジスタとして同時に使用することはできません。32 ビット コードの場合は、現在行っていることを除き、32 ビット レジスタを使用してください。おそらく望まない 16 ビットのアドレッシング モードを誤って使用しました。

mov ecx, arraysize-1              ;loop definition
mov ebx, 8

Lp:
mov eax,[setarray+ebx-4]
add eax,[setarray+ebx-4]
add eax,[setarray+ebx-8]
mov [setarray+ebx],eax

add ebx,4
dec ecx
jnc Lp

一部の最新のプロセッサが非常に高速に実行できる場合でも、決してループ命令を使用しないでください (ほとんどのプロセッサは実行できません)。

于 2010-11-22T15:31:54.470 に答える
0

私もアセンブラーの初心者ですが、私のアルゴリズムは少し異なります。


    A   dword   1026 dup (0)          ; declare this in the data segm.

; ...

    mov     esi, offset A         ; point at the results array
    mov     [esi], 1               ; initialize A(0)
    mov     [esi + 4], 2           ;  and A(1)
    xor  ecx, ecx

lp: add esi, 8
mov eax, [esi - 4] ; get A(n-1) add eax, eax ; double it add eax, [esi - 8] ; computes A(n) mov [esi], eax ; and save it inc ecx ; next n cmp ecx, n ; be sure n is a dword, use ; cmp ecx, dword ptr n ; if it isn't jb lp ; loop until ecx < n ; ; now you should have the results in the A array with ; esi pointing to the end of it

うまく動作するかどうかを確認するためにコンパイルしませんでしたが、うまくいくはずです..

于 2010-11-28T14:51:22.280 に答える