junshi 发表于 2023-11-25 10:57:49

实验六 问题求助 为什么有错误

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,
                and al,11011111b
                mov ,al
                inc si
                loop s1
                add bx,16
                pop      cx
                loop s

                mov ax,4c00h
                int 21h

code ends

end start

FishC_GPT 发表于 2023-11-25 10:58:08

这段代码中存在一些错误。首先,data段定义的字符串没有以'$'结尾,导致在使用mov指令复制字符串时会出现错误。其次,在mov指令中,缺少了源操作数和目标操作数的寄存器或内存地址,这也会导致错误。最后,在循环s1中,缺少了一些指令。

下面是修正后的代码:

assume cs:code

data segment
      db '1. display      $'
      db '2. browse       $'
      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, ax
      mov sp, 16
      mov cx, 4
      mov bx, 0
s:      push cx
      mov si, offset data + 2   ; 将偏移地址设为数据段的第一个字符串之后
s1:   mov al,             ; 通过间接寻址方式加载si指向的数据
      and al, 11011111b
      mov , al         ; 通过间接寻址方式存储修改后的数据
      inc si
      loop s1
      add bx, 16
      pop cx
      loop s

      mov ah, 4ch
      int 21h

code ends

end start

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

jackz007 发表于 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,'a'
            jb s2
            cmp byte ptr,'z'
            ja s2
            and byte ptr,11011111b
s2:         inc si
            loop s1
            add bx,16
            pop cx
            loop s
            mov ax,4c00h
            int 21h
code ends
end start
      请楼主特别关注,这样写代码,堆栈会自行 "对号入座" ,不用专门为 SS 和 SP 赋值。

junshi 发表于 2023-11-25 14:18:14

我的循环是是否有问题那问题正确的逻辑说明一下
页: [1]
查看完整版本: 实验六 问题求助 为什么有错误