鱼C论坛

 找回密码
 立即注册
查看: 380|回复: 3

汇编实验五第五小题求助

[复制链接]
发表于 2023-11-23 21:51:07 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. assume cs:code

  2. a segment

  3.     db 1,2,3,4,5,6,7,8

  4. a ends

  5. b segment

  6.     db 1,2,3,4,5,6,7,8

  7. b ends

  8. c segment

  9.     db 0,0,0,0,0,0,0,0

  10. c ends

  11. code segment

  12. start:  mov ax,a
  13.         mov ds,ax

  14.         mov ax,b
  15.         mov es,ax

  16.         mov ax,c
  17.         mov ss,ax
  18.         mov sp,8
  19.         mov bx,0
  20.         mov cx,8
  21.         mov ax,0

  22. ocean:  add al,[bx]
  23.         add al,es:[bx]
  24.         
  25.         mov ss:[bx],al
  26.         mov al,0
  27.         inc bx
  28.         loop ocean

  29.         mov ax,4c00h
  30.         int 21h

  31. code ends

  32. 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

有没有大佬知道,这是为什么呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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[bx], al`来将`al`的值存储到`c`段的内存地址`bx`处。

所以,修改后的代码如下:
  1. assume cs:code
  2. a segment
  3.     db 1,2,3,4,5,6,7,8
  4. a ends
  5. b segment
  6.     db 1,2,3,4,5,6,7,8
  7. b ends
  8. c segment
  9.     db 0,0,0,0,0,0,0,0
  10. c ends
  11. code segment
  12. start:  
  13.     mov ax, a
  14.     mov ds, ax
  15.     mov ax, b
  16.     mov es, ax
  17.     mov bx, 0
  18.     mov cx, 8
  19.     mov ax, 0
  20. ocean:  
  21.     add al, ds:[bx]
  22.     add al, es:[bx]
  23.         
  24.     mov c[bx], al
  25.     mov al, 0
  26.     inc bx
  27.     loop ocean
  28.     mov ax, 4c00h
  29.     int 21h
  30. code ends
  31. end start
复制代码

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

希望能帮助到你!如果还有其他问题,请随时提问。
以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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。回复仅供参考,如有人工回答,最佳答案请优先选择人工
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

感谢回复,偏移8个字节后是相当于c段的第9个字节开始存答案嘛,那为什么从第九个字节开始还是00呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-28 23:04

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表