4
INCLUDE Irvine16.inc

.data
    byteArray   BYTE 6 DUP(?)
    listSize = ($ - byteArray)
    aSum        WORD 0
    soffset = 0
.code
main PROC
    mov     ax, @data
    mov     ds, ax
    mov     cx, listSize
Loop1:
    mov     ax, 0
    movzx   ax, [byteArray + soffset]
    add     aSum, ax
    soffset = soffset + 1
    loop Loop1
    exit
main ENDP
END main

私が得ているエラーは、エラー「A2074:セグメントレジスタを介してラベルにアクセスできません」です。

soffsetを使用してbyteArrayをループしようとしています。

4

2 に答える 2

3

このエラーは、DOS プログラム ( .model!= flat) をCOFF.obj ファイルにアセンブルしようとしたために発生します。さらに、ML.EXE はerror A2006:undefined symbol : DGROUP. ソースは昔ながらのファイルにアセンブルする必要がありOMFます。次のコマンド ラインを使用してファイルをビルドします。

ml.exe /omf hello.asm
link16.exe hello.obj, hello.exe;

ml.exeVisual Studio インストールの一部です。Irvine のライブラリ スイートのlink16.exe一部です(「サンプル プログラムとリンク ライブラリ ソース コード...」)。

于 2015-12-21T19:47:21.383 に答える
2

Irvine16.incに何が入っているかはわかりませんが.model small,...、ある時点で言っているに違いありません。

追加する場合

ASSUME DS:_DATA

そうすればエラーメッセージは消えますが、それでプログラムを実行するのに十分かどうかは疑問です。


わかりました、私は考えを持っています。32ビットの例に切り替える必要があると思います。これは、セグメントレジスタがOSによって設定され、プログラムによって使用されないフラットモデルです。irvineの例とサンプルプロジェクトをダウンロードしました。これはたまたま32ビットであり、アセンブルして実行しました。

x86マシンコードである奇妙でねじれた世界では、少なくともユーザープログラムの観点からは、16ビットモデルは32ビットモデルよりもかなり複雑です。

于 2009-10-03T04:47:56.853 に答える