0

我目前正在编写一个写入 20 个第一个斐波那契数的程序。我目前要问的是这件事是否可以完成:

MOV DS, 3000H
MOV SI, 4000H
MOV DL, 123
MOV CL, 5
MOV DS:[SI+CL], DL

(这只是一个与斐波那契数无关的通用代码)因此它将'123'写入地址3000H:4005H的内存中。这甚至可能吗?所以我不需要同时增加 SI 和 CL(我使用 CL 在程序达到 20 或 14h 时结束程序)。

编辑:这是我的实际代码,但它没有正确写入数据。

cseg segment
assume cs:cseg
    Start:  mov ax, 3000h
            mov ds, ax
            mov si, 4000h
            mov bx, 0
            mov al, 1
            mov bl, 1
            mov ds:[si], al
            inc bx
            mov ds:[si+bx], bl
            inc bx
    Again:  mov dl, al
            add dl, bl
            mov al, bl
            mov bl, dl
            mov ds:[si+bx], dl
            inc bx
            cmp bx, 20
            jc Again
            int 3h
cseg    ends
end     Start
4

1 回答 1

1

您应该重新阅读解释 16 位地址模式的文档。

简而言之,您只能使用基址寄存器BXor BP,索引寄存器SIor DI,以及有效地址中的常量位移。因此,您可以这样做:

MOV AX, 3000H
MOV DS, AX
MOV SI, 4000H
MOV DL, 123
MOV BX, 5
MOV [SI+BX], DL

如果你的位移是恒定的 4000H,那么你也可以这样写:

MOV AX, 3000H
MOV DS, AX
MOV DL, 123
MOV BX, 5
MOV [4000H+BX], DL
于 2015-01-13T13:04:15.240 回答