0
;program starts

TABLE  DB 0, 2, 0, 2, 0, 0, 4, 0, 0, 1, 0, 0, 3, 0, 1, 0   
TABLE1 DB ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?   

MOV SI, OFFSET TABLE  
MOV DI, OFFSET TABLE1

MOV AL, [SI]
MOV [DI], AL

MOV AL, [SI+1]
MOV [DI+4], AL

MOV AL, [SI+2]
MOV [DI+8], AL

MOV AL, [SI+3]
MOV [DI+12], AL

MOV AL, [SI+4]
MOV [DI+1], AL

;program ends

「TABLE」から「TABLE1」にデータをコピーする簡単なコードを次に示します。このプログラムを emu8086 で実行すると、値 [SI] が AL レジスタ (MOV AL, [SI]) に表示されます。したがって、'TABLE' の値は AL レジスタに表示され、論理的に同じである必要があります。しかし、「MOV AL, [SI+1]」という行が実行されると、AL レジスターは 2 ではなく 4 を示します。この 2 番目の要素を 3 に置き換えると、Al レジスターは 3 ではなく 6 を示します。誰でも理由を説明できますか?このイベントとそれに対抗する方法は?

4

1 に答える 1

0

EMU のアセンブリ プログラムには、コードにない構造が必要です。

.model small                 ◄■■■ PROGRAM SIZE.
.stack 100h                  ◄■■■ STACK SEGMENT DECLARATION.
.data                        ◄■■■ DATA SEGMENT DECLARATION.

TABLE  DB 1, 2, 3, 4, 5, 0, 4, 0, 0, 1, 0, 0, 3, 0, 1, 0   
TABLE1 DB ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?   

.code                        ◄■■■ CODE SEGMENT DECLARATION.

mov ax, @data                ◄■■■ INITIALIZATION
mov ds, ax                   ◄■■■ OF DATA SEGMENT.

MOV SI, OFFSET TABLE  
MOV DI, OFFSET TABLE1

MOV AL, [SI]
MOV [DI], AL

MOV AL, [SI+1]
MOV [DI+4], AL

MOV AL, [SI+2]
MOV [DI+8], AL

MOV AL, [SI+3]
MOV [DI+12], AL

MOV AL, [SI+4]
MOV [DI+1], AL

mov ax, 4c00h                ◄■■■ FINISH PROGRAM PROPERLY.
int 21h

この構造を使用すると、コードが機能します (TABLEテスト目的で の値をいくつか置き換えました)。

于 2016-11-14T16:35:50.853 に答える