Ocea!] 发表于 2023-11-23 21:51:07

汇编实验五第五小题求助

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

c segment

    db 0,0,0,0,0,0,0,0

c ends

code segment

start:mov ax,a
      mov ds,ax

      mov ax,b
      mov es,ax

      mov ax,c
      mov ss,ax
      mov sp,8
      mov bx,0
      mov cx,8
      mov ax,0

ocean:add al,
      add al,es:
      
      mov ss:,al
      mov al,0
      inc bx
      loop ocean

      mov ax,4c00h
      int 21h

code ends

end start




问一下大家,这个我用的一个循环,顺便把sp也赋值了,因为没有用到栈,所以sp不应该对结果没有影响嘛?但是当我跑结果的时候发现,sp的值居然对结果有影响,我一开始给的sp是8,结果c段如下显然不对

02 04 28 00 b3 04 93 01 00 00 00 00 00 00 00 00

当我把sp设为16(十进制),或者是默认sp为0时,结果是对的,结果如下
02 04 06 08 0a 0c 0e 10 00 00 00 00 00 00 00 00

我随意又改了下sp的值为14(十进制),发现c段如下
02 04 06 08 0a 0c 0e 10 28 00 b3 04 93 01 00 00

有没有大佬知道,这是为什么呢?

FishC_GPT 发表于 2023-11-23 21:52:32

你好!根据你提供的代码,我看到在循环中,你使用了`mov ss:,al`来将`al`的值存储到`ss`段中。这个操作是不正确的。

首先,`ss`寄存器用于存储栈的段地址,而不是数据的存储段地址。通常情况下,我们会在程序开始时设置`ds`、`es`和`ss`的值,然后使用`bx`、`di`或者`si`等寄存器来访问这些段。对于这个问题来说,我们只需要使用`ds`和`es`来计算并访问数据即可,不需要使用`ss`。

其次,你使用了`mov ss:,al`来将`al`的值存储到内存中,但是没有指定存储的地址。正确的做法应该是指定一个有效的内存地址,例如`mov c, al`来将`al`的值存储到`c`段的内存地址`bx`处。

所以,修改后的代码如下:

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

c segment
    db 0,0,0,0,0,0,0,0
c ends

code segment
start:
    mov ax, a
    mov ds, ax

    mov ax, b
    mov es, ax

    mov bx, 0
    mov cx, 8
    mov ax, 0

ocean:
    add al, ds:
    add al, es:
      
    mov c, al
    mov al, 0
    inc bx
    loop ocean

    mov ax, 4c00h
    int 21h
code ends

end start

现在,我们只是使用了`ds`和`es`段寄存器来访问数据,并将结果存储到`c`段的内存中。不再使用`ss`寄存器,因此无需设置`sp`的值。这样你会发现,不再受到`sp`的影响,得到的结果是正确的。

希望能帮助到你!如果还有其他问题,请随时提问。
以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。

Mike_python小 发表于 2023-11-23 21:52:50

在这段代码中,使用了两个段a和b的数据对应相加,并存储到了段c中。由于段c的初始值为全0,因此如果对于每个字节单独进行累加,最终结果应该是对的。

至于为什么SP的值会影响结果,原因是在程序中使用了SS寄存器,它与SP寄存器有关联。当SS寄存器被修改时,栈的起始地址也会发生变化,因此存储到内存中的数据可能会发生偏移。在这个例子中,如果将SP的值设置为8,那么SS:SP的值就是C:8,而C段的起始地址是0,因此累加后的数据存储位置会从C:0开始偏移8个字节,导致取出的数据不正确。

因此,建议在程序中不要随意修改SS和SP的值,除非你确切地知道自己在做什么。如果需要使用栈,可以先初始化SP的值,然后将SS和SP的值同时入栈,最后在程序结束前将它们出栈恢复原值。

回复来自于CHAT-GPT。回复仅供参考,如有人工回答,最佳答案请优先选择人工

Ocea!] 发表于 2023-11-24 23:16:39

Mike_python小 发表于 2023-11-23 21:52
在这段代码中,使用了两个段a和b的数据对应相加,并存储到了段c中。由于段c的初始值为全0,因此如果对于每 ...

感谢回复,偏移8个字节后是相当于c段的第9个字节开始存答案嘛,那为什么从第九个字节开始还是00呢
页: [1]
查看完整版本: 汇编实验五第五小题求助