鱼C论坛

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

[汇编作业] 实验六 问题求助 为什么有错误

[复制链接]
发表于 2023-11-25 10:57:49 | 显示全部楼层 |阅读模式

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

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

x
assume cs:code

data segment
        db '1. display      '
        db '2. brows        '
        db '3. replace      '
        db '4. modify       '
data ends

stack segment
        dw 0,0,0,0,0,0,0,0
stack ends

code segment
start:        mov ax,data
                mov ds,ax
                mov ax,stack
                mov ss,stack
                mov sp,16
                mov cx,4
                mov bx,0
        s:        push cx
                mov si,3
                mov cx,4
        s1:        mov al,[bx+si]
                and al,11011111b
                mov [bx+si],al
                inc si
                loop s1
                add bx,16
                pop        cx
                loop s

                mov ax,4c00h
                int 21h

code ends

end start

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

使用道具 举报

发表于 2023-11-25 10:58:08 | 显示全部楼层
这段代码中存在一些错误。首先,data段定义的字符串没有以'$'结尾,导致在使用mov指令复制字符串时会出现错误。其次,在mov指令中,缺少了源操作数和目标操作数的寄存器或内存地址,这也会导致错误。最后,在循环s1中,缺少了一些指令。

下面是修正后的代码:
assume cs:codedata segment         db '1. display      $'        db '2. browse       $'        db '3. replace      $'        db '4. modify       $'data endsstack segment        dw 0,0,0,0,0,0,0,0stack endscode segmentstart:  mov ax, data        mov ds, ax        mov ax, stack        mov ss, ax        mov sp, 16        mov cx, 4        mov bx, 0s:      push cx        mov si, offset data + 2   ; 将偏移地址设为数据段的第一个字符串之后s1:     mov al, [si]            ; 通过间接寻址方式加载si指向的数据        and al, 11011111b        mov [bx+si], al           ; 通过间接寻址方式存储修改后的数据        inc si        loop s1        add bx, 16        pop cx        loop s        mov ah, 4ch        int 21hcode endsend start
修正后的代码将字符串定义中的每个字符串末尾添加了'$',并通过间接寻址方式加载和存储数据。同时,在退出程序时,将4c00h保存在ah寄存器中,并调用中断21h来正常退出程序。请尝试运行这段代码,看是否能够正常工作。如果还有其他问题,请及时反馈。
以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-25 12:15:16 | 显示全部楼层
本帖最后由 jackz007 于 2023-11-25 12:48 编辑
                mov ax,stack
                mov ss,stack    ; 此句错误,应改为 mov ss,ax
                mov sp,16
        我给改写了一个版本,谨供楼主参考
assume cs:code,ds:data

data segment para public 'data'
        db '1. display      '
        db '2. browse       '
        db '3. replace      '
        db '4. modify       '
data ends

stack segment para stack 'stack'
        dw 8 dup(0)
stack ends

code segment para public 'code'
start:        mov ax,data
              mov ds,ax
              xor bx,bx
              mov cx,4
s:            push cx
              xor si,si
              mov cx,16
s1:           cmp byte ptr[bx+si],'a'
              jb s2
              cmp byte ptr[bx+si],'z'
              ja s2
              and byte ptr[bx+si],11011111b
s2:           inc si
              loop s1
              add bx,16
              pop cx
              loop s
              mov ax,4c00h
              int 21h
code ends
end start
        请楼主特别关注,这样写代码,堆栈会自行 "对号入座" ,不用专门为 SS 和 SP 赋值。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-11-25 14:18:14 | 显示全部楼层
我的循环是是否有问题  那问题正确的逻辑说明一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-21 19:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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