assembly 大会8086运动大学

tvokkenx  于 2023-08-06  发布在  其他
关注(0)|答案(1)|浏览(83)

有没有人能在intel 8086处理器的汇编程序中开发一个过程,从数据段中读取整数向量,并将向量的前DIM/2个元素替换为数据段的定义瓦尔值?
我试着写了一些东西:

STACKSEGMENT SEGMENT PUBLIC 'DATACLASS'
    DB 8 DUP(O)
STACKSEGMENT ENDS
DATASEGMENT SEGMENT PUBLIC 'DATACLASS'
    VECTOR  DW 4 DUP (?)
    DIM     DW 4
    VAL     DW 5
DATASEGMENT ENDS
MYCODESEG SEGMENT PARA PUBLIC 'CODECLASS'
MYPROC PROC NEAR
ASSUME CS: MYCODESEG, DS:DATASEGMENT, SS:STACKSEGMENT

MOV AX, DATASEGMENT
MOV DS, AX
LEA AX, VECTOR
PUSH AX
MOV AX, DIM
PUSH AX
MOV AX, VAL
PUSH AX
CALL MYPROC
ADD SP,10

mov ah, 4Ch
int 21h

MYCODESEG ENDS
END MYPROC
END

字符串

xkrw2x1b

xkrw2x1b1#

MOV AX, DATASEGMENT
MOV DS, AX
LEA AX, VECTOR
PUSH AX
MOV AX, DIM
PUSH AX
MOV AX, VAL
PUSH AX
CALL MYPROC
ADD SP,10

字符串
如果你想把VECTOR的内容读入AX,这是不行的。

MOV AX, DATASEGMENT
MOV DS, AX


这是正确的。“

LEA AX, VECTOR
PUSH AX


但是,这并不能让您找到VECTOR的内容。LEA代表“加载有效地址”。请记住,标签VECTOR只是数据的存储位置,而不是数据本身。实际上你刚刚做了

mov ax, offset VECTOR
push ax


这并不能让你更接近你想要的。在这个CPU上,你实际上不能用ax从内存中读取数据。只有bxbpsidi可以执行。这就是你真正想要的:

MOV AX, DATASEGMENT
MOV DS, AX
LEA SI, VECTOR
MOV AX, [SI]


SI周围加上括号,使其成为内存加载操作。这会取得向量数组中的第一个16比特值,并将它载入AX。如果没有括号,即MOV AX, SI,你只是把向量数组的地址移到AX中,这并不能实现任何东西。
话虽如此,您已将VECTOR声明为VECTOR DW 4 DUP (?),这告诉汇编程序“这里需要4个字的空间,但我不关心现在的值是什么,因为我要编写的代码将填充它们。”因此,从一开始就读取这些数据不会完成任何有价值的事情。通过上面的代码示例,您可以在ax中获得一些东西,但不能保证您获得的数据具有任何真实的的意义。

相关问题