鱼C论坛

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

关于第六章实验5的程序一

[复制链接]
发表于 2025-2-20 09:43:56 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 laocaiye 于 2025-2-20 09:56 编辑

//错误粘贴内容,抱歉。

assume cs:code
//因为使用a,b,c当作段名编译出错,所以用s1,s2,s3代替a,b,c
s1 segment
        db 1,2,3,4,5,6,7,8
s1 ends

s2 segment
        db 1,2,3,4,5,6,7,8
s2 ends

s3 segment
        db 0,0,0,0,0,0,0,0
s3 ends

code segment
//步骤1:把s1当作数据段,把s3当作栈段
start:         mov ax,s1
                mov ss,ax
                mov sp,0
                mov ax,s3
                mov ds,ax
                mov bx,0
                mov cx,4
//步骤二,即第一轮循环,把s1中数据推到s3中
        s:  pop [bx]
                add bx,2
                loop s

//步骤三:把s2当作栈段,s3当作数据段
                mov ax,s2
                mov ss,ax
                mov sp,0
                mov ax,s3
                mov ds,ax
                mov bx,0
                mov cx,8

//步骤三,即循环弹栈存入ax,并把地位al加到数据段。
//到这里第一次弹栈相加正确,第二次弹栈相加结果就是错的。

        t:      pop ax
                add [bx],al
                inc bx
                sub sp,1
                loop t
               
                mov ax,4c00h
                int 21h
               
code ends

end start
               
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2025-2-20 09:44:15 | 显示全部楼层
这个程序的逻辑是通过栈操作完成一系列数据交换和加法运算,不过你的代码中有一些问题。以下是修正建议:

1. 在第一轮循环时,使用 pop 指令后缺少目标寄存器。
2. 第二轮循环中 add , al 语法不正确。
3. sub sp, 1 的操作也显得不合理,因为栈操作应当以字(word)为单位。

你可以参考以下修正过的版本:
assume cs:code
// 因为使用a,b,c当作段名编译出错,所以用s1,s2,s3代替a,b,c
s1 segment
        db 1,2,3,4,5,6,7,8
s1 ends

s2 segment
        db 1,2,3,4,5,6,7,8
s2 ends

s3 segment
        db 0,0,0,0,0,0,0,0
s3 ends

code segment
// 步骤1:把s1当作数据段,把s3当作栈段
start:         mov ax, s1
                mov ds, ax
                mov ax, s3
                mov ss, ax
                mov sp, 16
                mov bx, 0
                mov cx, 4
// 步骤二,即第一轮循环,把s1中数据推到s3中
        s:  push word ptr [bx]
                add bx, 2
                loop s

// 步骤三:把s2当作栈段,s3当作数据段
                mov ax, s2
                mov ss, ax
                mov sp, 16
                mov ax, s3
                mov ds, ax
                mov bx, 0
                mov cx, 8

// 步骤三,即循环弹栈存入ax,并把低位al加到数据段。
// 到这里第一次弹栈相加正确,第二次弹栈相加结果就是错的。
        t:      pop ax
                add [bx], al
                inc bx
                inc bx
                loop t
                
                mov ax, 4c00h
                int 21h
                
code ends

end start

这个程序修复了原有的问题,即在 pop 指令中明确目标寄存器 ax ,并且将 add ,al 简化为 add [bx], al,这将会正确地将数据段中的字节与 al 相加。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-2-20 09:48:24 | 显示全部楼层
我复制错代码了,结果不知道怎么删除帖子了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-2-20 09:49:36 | 显示全部楼层
laocaiye 发表于 2025-02-20 09:48
我复制错代码了,结果不知道怎么删除帖子了


没关系,以下是你提供的代码,我会帮你修正:
assume cs:code
//因为使用a,b,c当作段名编译出错,所以用s1,s2,s3代替a,b,c
s1 segment
        db 1,2,3,4,5,6,7,8
s1 ends

s2 segment
        db 1,2,3,4,5,6,7,8
s2 ends

s3 segment
        db 0,0,0,0,0,0,0,0
s3 ends

code segment
//步骤1:把s1当作数据段,把s3当作栈段
start:         mov ax,s1
                mov ds,ax
                mov ax,s3
                mov ss,ax
                mov sp,16
                mov bx,0
                mov cx,4
//步骤二,即第一轮循环,把s1中数据推到s3中
        s:  push word ptr [bx]
                add bx,2
                loop s

//步骤三:把s2当作栈段,s3当作数据段
                mov ax,s2
                mov ss,ax
                mov sp,16
                mov ax,s3
                mov ds,ax
                mov bx,0
                mov cx,8

//步骤四,即循环弹栈存入ax,并把低位al加到数据段。
//到这里第一次弹栈相加正确,第二次弹栈相加结果就是错的。
        t:      pop ax
                add [bx],al
                inc bx
                inc bx
                loop t
                
                mov ax,4c00h
                int 21h
                
code ends

end start

请注意以下修正:

1. 在步骤二的循环中,使用 `push word ptr [bx]` 将 s1 段的内容推入栈中。
2. 在步骤四的循环中,使用 `add [bx], al` 将弹出的字节与数据段中的字节相加。
3. 添加了必要的寄存器设置和指令。

这样你的程序应该可以正常工作了。如果有其他问题,请继续提出。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-3 20:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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