求教:程序运行前与运行后神奇发现某条指令自动变了><

lxs85 2008-12-03 03:58:00
今天下午看王爽老师的汇编语言第七章的时候动手写程序调试,最后一题

问题7.9(要求是把四个单词,每个词的前四个字母变成大写)

按要求写出了程序,然后上机试验,发现只成功把每个词的第一个字母变成了大写其余失败。经查是因为堆栈问题,没有定义SP

程序如下
assume cs:codesg,ss:stacksg,ds:datasg

stacksg segment
dw 0,0,0,0,0,0,0,0
stacksg ends

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

codesg segment

start:mov ax,stacksg
mov ss,ax
mov sp,16
mov ax,datasg
mov ds,ax
mov bx,0
mov cx,4

s:push cx
mov si,0
mov cx,4

s1:mov al,[bx+si+3]
and al,11011111b
mov [bx+si+3],al
inc si
loop s1

add bx,16
pop cx
loop s

mov ax,4c00H
int 21H
codesg ends
end
============

既然有问题就改吧便定义好SP,更改后程序如下

assume cs:codesg,ss:stacksg,ds:datasg

stacksg segment
dw 0,0,0,0,0,0,0,0
stacksg ends

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

codesg segment

start:mov ax,stacksg
mov ss,ax
mov sp,16 ;只在这里增加了一行
mov ax,datasg
mov ds,ax

mov bx,0
mov cx,4

s:push cx
mov si,0
mov cx,4

s1:mov al,[bx+si+3]
and al,11011111b
mov [bx+si+3],al
inc si
loop s1

add bx,16
pop cx
loop s

mov ax,4c00H
int 21H
codesg ends
end
----------

把程序编译链接成EXE文件没问题,但在调试时问题就出来了,即无法正确变换,最后还提示
insufficient memory

仔细调试程序才发现一神奇问题

原本在 mov [bx+si+3],al却神奇的自动变成 add [bx+si+3],al 了



这个是什么原因呢?到底是我程序有问题还是什么问题?有朋友遇到过此类问题吗?

...全文
89 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
lxs85 2008-12-03
  • 打赏
  • 举报
回复
PS下,为什么会出现 这样的错误呢?就算少加了句错误也不应该把指令改了啊><
lxs85 2008-12-03
  • 打赏
  • 举报
回复
汗,犯了细节错误。
要注意了

多谢楼上几位了
xtdumpling 2008-12-03
  • 打赏
  • 举报
回复
小补充一下:
stacksg segment stack
dw 0,0,0,0,0,0,0,0
stacksg ends

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

codesg segment 'code'
assume cs:codesg,ss:stacksg,ds:datasg
start:
mov ax,stacksg
mov ss,ax
mov ax,datasg
mov ds,ax
mov bx,0
mov cx,4

s:
push cx
mov si,0
mov cx,4

s1:
mov al,[bx+si+3]
and al,11011111b
mov [bx+si+3],al
inc si
loop s1

add bx,16
pop cx
loop s

mov ah,4cH
int 21H
codesg ends
end start
pangu9999 2008-12-03
  • 打赏
  • 举报
回复
end start
哈哈 和我以前一样
cnzdgs 2008-12-03
  • 打赏
  • 举报
回复
SS=0000,SP=000E,My God!
killbug2004 2008-12-03
  • 打赏
  • 举报
回复
原代码没有错,只是楼主少了一句只是程序的入口,最后面end start我这里调试正确
stacksg segment 
dw 0,0,0,0,0,0,0,0
stacksg ends

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

codesg segment
assume cs:codesg,ss:stacksg,ds:datasg
start:
mov ax,stacksg
mov ss,ax
mov ax,datasg
mov ds,ax
mov bx,0
mov cx,4

s:
push cx
mov si,0
mov cx,4

s1:
mov al,[bx+si+3]
and al,11011111b
mov [bx+si+3],al
inc si
loop s1

add bx,16
pop cx
loop s

mov ah,4cH
int 21H
codesg ends
end start

21,500

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧