实验10.3程序执行过程中数据损坏
本帖最后由 玛丽亚在伯大尼 于 2022-6-27 18:36 编辑用DEBUG调试过了,发现从c1:mov bx,0处开始原本定义好的数据发生了变化(之后越变越离谱),然而前面没有执行改变数据的指令
我想请教一下各位大佬,这是由什么导致的
下面是代码:
assume ds:data,cs:code,ss:stack
data segment
dw 123,12666,1,8,3,38,10
;db 64 dup (0)
data ends
stack segment
dw 16 dup (0)
stack ends
code segment
main:mov ax,data
mov ds,ax
mov cx,6
mov si,0
mov di,0
mov sp,32
c1: mov bx,0 ;从这里开始出现问题
push cx
call dtoc
pop cx
inc si
loop c1
mov ax,4C00H
int 21H
dtoc:mov ax,
push si
mov cx,ax
jcxz c4
c2: mov dx,0 ;取各个位上的数压栈
mov si,12
div word ptr
mov cx,ax
jcxz c4
add dx,30H
push dx
inc bx
jmp c2
c4: add dx,30H
push dx
inc bx
mov cx,bx
c3: pop ;将转换好的数写入数据段
inc di
loop c3
inc di
pop si
ret
code ends
END main 本帖最后由 jackz007 于 2022-6-28 08:39 编辑
试试这个代码吧
assume cs:code , ds:data
data segment para public 'data'
dw 123,12666,1,8,3,38,10
data ends
edata segment para public 'edata'
db 10h dup(0)
edata ends
stack segment para stack 'stack'
dw 400h dup(0)
stack ends
code segment para public 'code'
dtoc proc near
push bp
mov bp,sp
push ax
push bx
push cx
push dx
push si
push ds
mov ax,edata
mov ds,ax
mov ax,
xor bx,bx
push bx
mov cx,10
d01: xor dx,dx
div cx
add dl,30h
mov byte ptr,dl
inc bx
or ax,ax
jnz d01
cmp bx,2
jb d03
xor si,si
mov cx,bx
shr cx,1
lea di,
d02: mov al,byte ptr
xchg al,byte ptr
xchg al,byte ptr
inc si
dec di
loop d02
d03: mov byte ptr,0ah
mov byte ptr,0dh
mov byte ptr,'$'
mov byte ptr,00h
pop dx
mov ah,09h
int 021h
pop ds
pop si
pop dx
pop cx
pop bx
pop ax
mov sp,bp
pop bp
ret 02
dtoc endp
main proc far
mov ax,data
mov ds,ax
xor bx,bx
mov cx,7
m01: push word ptr
call dtoc
add bx,2
loop m01
mov ax,4c00h
int 021h
main endp
code ends
end main
这个代码无需借助于 debug.exe,直接运行就可以从屏幕上看到那 7 个数值。 jackz007 发表于 2022-6-27 22:34
试试这个代码吧
这个代码无需借助于 debug.exe,直接运行就可以从屏幕上看到那 7 个数 ...
哥,我提问主要是想知道数据为什么会被改掉,代码怎么写倒不是特别重要
不过也感谢你的回答 本帖最后由 jackz007 于 2022-6-28 15:57 编辑
玛丽亚在伯大尼 发表于 2022-6-28 10:12
哥,我提问主要是想知道数据为什么会被改掉,代码怎么写倒不是特别重要
不过也感谢你的回答
代码问题有 3 个,其中最主要的 1 个是没有为堆栈段赋值,从而导致堆栈段上半部分的 16 个字节与数据段相重叠,堆栈数据意外侵占数据段内容。
assume ds:data,cs:code,ss:stack
data segment
dw 123,12666,1,8,3,38,10
;db 64 dup (0)
data ends
stack segment
dw 200h dup (0) ; 【问题1】:堆栈段为什么定义得那么小?- 已修正
stack ends
code segment
main:mov ax,data
mov ds,ax
mov ax,stack ; 【问题2】:堆栈段为何不赋值?- 此行新加
mov ss,ax ; 【问题2】:堆栈段为何不赋值?- 此行新加
mov sp,400h ; 堆栈段容量调整,此句进行相应的修改,各个段的初始化代码最好放在所有语句的最前面。
mov cx,6
mov si,0
mov di,0
c1: mov bx,0
push cx
call dtoc
pop cx
add si,2 ; 【问题3】:一个 16 位整型数占用的是 2 个字节,这里 si 为何只加 1?- 已修正
loop c1
mov ax,4C00H
int 21H
dtoc:mov ax,
push si
mov cx,ax
jcxz c4
c2: mov dx,0
mov si,12
div word ptr
mov cx,ax
jcxz c4
add dx,30H
push dx
inc bx
jmp c2
c4: add dx,30H
push dx
inc bx
mov cx,bx
c3: pop
inc di
loop c3
inc di
pop si
ret
code ends
end main
堆栈问题最简单的解决方法是删除 mov sp,32 这一句也同样可以解决问题。
堆栈段的定义和初始化方法楼主可以参考我的代码,只要伪指令应用得当,堆栈段其实是不需要任何初始化的。
页:
[1]