使用数据段
Using data segment
我目前正在编写一个程序,可以写入 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
您应该重新阅读解释 16 位地址模式的文档。
简而言之,只能使用一个基址寄存器BX
或BP
,一个变址寄存器SI
或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
我目前正在编写一个程序,可以写入 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
您应该重新阅读解释 16 位地址模式的文档。
简而言之,只能使用一个基址寄存器BX
或BP
,一个变址寄存器SI
或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