|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
题目:将A,B中的的值相加到D中
ASSUME CS:CODE
A SEGMENT
DB 1,2,3,4,5,6,7,8
A ENDS
B SEGMENT
DB 1,2,3,4,5,6,7,8
B ENDS
D SEGMENT
DB 0,0,0,0,0,0,0,0
D ENDS
CODE SEGMENT
START: MOV AX,A
MOV DS,AX;DS段寄存器
MOV AX,B
MOV ES,AX;ES段寄存器
MOV BX,0
MOV AX,D
MOV SS,AX;SS段寄存器
MOV CX,8
S: MOV AL,[BX]
MOV SS:[BX],AL
MOV AL,ES:[BX] ;这个循环在debug中我发现用AX代替AL结果不变都是 02 04 06 08 0A 0C 0E 10-00
ADD SS:[BX],AL 请问什么时候AX,AL两者有区别呢
INC BX
LOOP S
MOV AX, 4C00H
INT 21H
CODE ENDS
END START
AX 和 AL 的区别
在x86架构中,AX是一个16位的寄存器,而AL是AX寄存器的低8位。这意味着当你操作AL时,你实际上是在操作AX的低8位,而AX的高8位(AH)保持不变。在你的代码中,当你使用MOV AL, [BX]和MOV AL, ES:[BX]时,你是在从相应的内存地址加载数据到AL(即AX的低8位)。然而,当你执行ADD SS:[BX], AL时,这个加法操作只影响SS:[BX](即D段中的相应字节),对AX的高8位(AH)没有任何影响。
代码中的问题
错误的段寄存器使用:
在你的代码中,你试图将D段的地址加载到SS(堆栈段寄存器)中。这是不正确的,因为SS是用于堆栈的,而D段看起来像是用于存储数据的。你应该使用一个不同的段寄存器(如DS)来访问D段。然而,在这个特定的例子中,因为你已经设置了DS来访问A段,你可能想保持DS不变,并使用一个不同的方法来指定D段的地址。
使用OFFSET来定位D段:
为了访问D段的数据,你可以使用OFFSET指令来获取D段的偏移地址,并将其加载到一个寄存器中(比如BX或DI),然后结合DS(或另一个段寄存器,如果你选择改变它)来访问D段的数据。
循环和累加:
你的循环逻辑本身是正确的,但在处理D段数据时需要注意上述问题。
|
|