8086,将数据从一个列表复制到另一个列表
问题描述:
;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.有没有人可以解释背后的原因这个事件以及如何对付它?8086,将数据从一个列表复制到另一个列表
答
动车组装配程序需要一定的结构,它是你的代码所缺少:
.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
一些值)。
+0
@protonmail,如果这个答案很有用,你可以点击复选标记来接受它(这就是你如何奖励人们的努力)。 –
DS有什么价值?它是否设置为数组所在的段?如果在文件顶部添加ORG 100h,程序是否工作? – Michael
';程序启动到数据表中?这可能会导致一些奇怪的行为。 – Ped7g