鱼C论坛

 找回密码
 立即注册
查看: 367|回复: 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中,缺少了一些指令。

下面是修正后的代码:
  1. assume cs:code
  2. data segment
  3.         db '1. display      $'
  4.         db '2. browse       $'
  5.         db '3. replace      $'
  6.         db '4. modify       $'
  7. data ends
  8. stack segment
  9.         dw 0,0,0,0,0,0,0,0
  10. stack ends
  11. code segment
  12. start:  mov ax, data
  13.         mov ds, ax
  14.         mov ax, stack
  15.         mov ss, ax
  16.         mov sp, 16
  17.         mov cx, 4
  18.         mov bx, 0
  19. s:      push cx
  20.         mov si, offset data + 2   ; 将偏移地址设为数据段的第一个字符串之后
  21. s1:     mov al, [si]            ; 通过间接寻址方式加载si指向的数据
  22.         and al, 11011111b
  23.         mov [bx+si], al           ; 通过间接寻址方式存储修改后的数据
  24.         inc si
  25.         loop s1
  26.         add bx, 16
  27.         pop cx
  28.         loop s
  29.         mov ah, 4ch
  30.         int 21h
  31. code ends
  32. end start
复制代码

修正后的代码将字符串定义中的每个字符串末尾添加了'$',并通过间接寻址方式加载和存储数据。同时,在退出程序时,将4c00h保存在ah寄存器中,并调用中断21h来正常退出程序。请尝试运行这段代码,看是否能够正常工作。如果还有其他问题,请及时反馈。
以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-25 12:15:16 | 显示全部楼层
本帖最后由 jackz007 于 2023-11-25 12:48 编辑
  1.                 mov ax,stack
  2.                 mov ss,stack    ; 此句错误,应改为 mov ss,ax
  3.                 mov sp,16
复制代码

        我给改写了一个版本,谨供楼主参考
  1. assume cs:code,ds:data

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

  8. stack segment para stack 'stack'
  9.         dw 8 dup(0)
  10. stack ends

  11. code segment para public 'code'
  12. start:        mov ax,data
  13.               mov ds,ax
  14.               xor bx,bx
  15.               mov cx,4
  16. s:            push cx
  17.               xor si,si
  18.               mov cx,16
  19. s1:           cmp byte ptr[bx+si],'a'
  20.               jb s2
  21.               cmp byte ptr[bx+si],'z'
  22.               ja s2
  23.               and byte ptr[bx+si],11011111b
  24. s2:           inc si
  25.               loop s1
  26.               add bx,16
  27.               pop cx
  28.               loop s
  29.               mov ax,4c00h
  30.               int 21h
  31. code ends
  32. end start
复制代码

        请楼主特别关注,这样写代码,堆栈会自行 "对号入座" ,不用专门为 SS 和 SP 赋值。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-28 18:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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