laocaiye 发表于 2025-2-20 09:43:56

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

本帖最后由 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
                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 ,al
                inc bx
                sub sp,1
                loop t
               
                mov ax,4c00h
                int 21h
               
code ends

end start
               

FishC 发表于 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
                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 , al
                inc bx
                inc bx
                loop t
               
                mov ax, 4c00h
                int 21h
               
code ends

end start

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

laocaiye 发表于 2025-2-20 09:48:24

我复制错代码了,结果不知道怎么删除帖子了

FishC 发表于 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
                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 ,al
                inc bx
                inc bx
                loop t
               
                mov ax,4c00h
                int 21h
               
code ends

end start

请注意以下修正:

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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 关于第六章实验5的程序一