实验六 问题求助 为什么有错误
assume cs:codedata 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
这段代码中存在一些错误。首先,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: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 赋值。 我的循环是是否有问题那问题正确的逻辑说明一下
页:
[1]