2016-11-14 98 views
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寄存器顯示4而不是2.如果我用3替換第二個元素,Al寄存器顯示6而不是3.有沒有人可以解釋背後的原因這個事件以及如何對付它?8086,將數據從一個列表複製到另一個列表

+0

DS有什麼價值?它是否設置爲數組所在的段?如果在文件頂部添加ORG 100h,程序是否工作? – Michael

+0

';程序啓動到數據表中?這可能會導致一些奇怪的行爲。 – Ped7g

回答

0

動車組裝配程序需要一定的結構,它是你的代碼所缺少:

.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,如果這個答案很有用,你可以點擊複選標記來接受它(這就是你如何獎勵人們的努力)。 –

相關問題