8086,将数据从一个列表复制到另一个
8086, copying data from one list to another
;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 寄存器显示 4 而不是 2。如果我用 3 替换第二个元素,Al 寄存器显示 6 而不是 3。谁能解释这个事件背后的原因以及如何反击它?
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
的一些值)。
;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 寄存器显示 4 而不是 2。如果我用 3 替换第二个元素,Al 寄存器显示 6 而不是 3。谁能解释这个事件背后的原因以及如何反击它?
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
的一些值)。