|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 玛丽亚在伯大尼 于 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,[si]
push si
mov cx,ax
jcxz c4
c2: mov dx,0 ;取各个位上的数压栈
mov si,12
div word ptr [si]
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 [di+16] ;将转换好的数写入数据段
inc di
loop c3
inc di
pop si
ret
code ends
END main
本帖最后由 jackz007 于 2022-6-28 15:57 编辑
代码问题有 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,[si]
push si
mov cx,ax
jcxz c4
c2: mov dx,0
mov si,12
div word ptr [si]
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 [di+16]
inc di
loop c3
inc di
pop si
ret
code ends
end main
堆栈问题最简单的解决方法是删除 mov sp,32 这一句也同样可以解决问题。
堆栈段的定义和初始化方法楼主可以参考我的代码,只要伪指令应用得当,堆栈段其实是不需要任何初始化的。
|
|