80x86汇编语言不能正常显示

时间:2023-02-13 01:01:11
我用80x86汇编语言,我利有mov指令向显存中写入不同格式数字来直接显示数字,可以把数字格式正常压入栈中,但我不能使有mov ax,stack mov ss,ax mov sp,16指令(stack为栈段),否则不能正常显示数字,请高手予以解答,感激不尽. 

8 个解决方案

#1


这么含糊?。。。谁知道你问题出在哪呢?
不妨把代码贴出来让大家帮你看看。。。

#2


data segment
db 'welcome to masm'
data ends
stack segment
db 16 dup (0)
stack ends
assume cs:code,ds:data,ss:stack
code segment
(mov ax,stack
 mov ss,ax
 mov sp,16)(这段代码一用就不能正常显示)
 mov ax,data
mov ds,ax
mov ax,9100h
push ax
mov ax,7100h
push ax
mov ax,1500h
push ax
mov cx,3
s:mov bp,0
  pop ax
  push cx
  mov cx,15
(后面都没问题,感觉就前面出问题了)

#3


你尝试用没用debug但不跟踪是什麽效果?

#4


我就在debug中用g命令直接运行的要不看不到效果我一加那三行代码就是无效cpu指令,不加可以正常运行

#5


去掉那3行就可以了吗???
估计也G不了!
我以初学者的初步看法:认为你这种情况要指明程序入口及结束点。。。
也就是说在第一条指令(mov ax,stack)前面要加个标号,END(结尾处)后面也把这个标号注上.应该就可以了。。。

#6


将声明 stack segment改为stack segment stack应该就没问题了 我只知道这样用 原因就不知道了 也期望高手们回答 解我心中的迷惑

#7


段定义的一般格式如下:
 
 段名 SEGMENT [对齐类型] [组合类型] [类别] 
… 
段名 ENDS 

组合类型(COMBINE)
组合类型是告诉连接程序如何把不同模块中段名相同的段合并在一起。具体的组合类型如下:

NONE 表示当前段在逻辑上独立于其它模块,并有其自己的基地址。NONE是缺省的组合类     型。
 
PUBLIC 表示当前段与其它模块中同段名的PUBLIC类型段组合成一个段。组合的先后次序取决于LINK程序中目标模块排列的次序。在组合时,后续段的起始地址要按其对齐类型进行定位,所以,同名段之间可能有间隔。 

COMMON 表示当前段与其它模块中同名段重叠,也就是说,它们的起始地址相同。最终段的长度是同名段的最大长度。由于段覆盖,所以,前一同名段中的初始化数据被后续段的初始数据覆盖掉。 

STACK 组合类型STACK表示当前段是堆栈栈,其组合情况与PUBLIC相同。 

AT 数值表达式 该数值表达式是当前段所指定的绝对起始地址的段地址。 



类别(CLASS)
类别是一个由程序员指定的用单引号括起来的字符串。如果一个段没有给出类别,那么,这个段的类别就为空。类别是用于段的分类,连接程序利用该类别来调整同名、同类别的段,并使它们相邻。典型的类别是"Data"和"Code"。如果指定某段的类别是"Code",那么,该段最好是代码段,这样,有的调试程序(如:CodeView)就可以顺序工作。

希望对你有帮助

#8


引用 4 楼 findstr 的回复:
我就在debug中用g命令直接运行的要不看不到效果我一加那三行代码就是无效cpu指令,不加可以正常运行


上面说的目的是:首先在运行或调试程序时要把CS:IP调整到指向首个指令。。。如你这个,很可能就将DS和SS内的信息也被作为指令了(里面的信息会以什么样的指令形式表现很不确定)。那么一运行或调试,IP难保不乱跑。出错就在所难免了。
你可以试试在DEBUG下,首先把IP手工修改指向mov ax,stack 那,再调试,我初步估计首先IP要被调整为20H才能指向mov ax,stack 处。。。
你自己多调试下看看。。。!

另外因为你的代码不全,后面看不到。在提示下,你自己再调试下。
就是把
stack segment
db 16 dup (0)  ;改大点,如:DB 32 DUP (0)
stack ends 
也可以把
mov ax,stack
mov ss,ax
mov sp,16 ;改为mov sp,16 H这里的疑点也很大,或者SP在STACK改大的情况下再改大一点。。。
再试试。。。
我自己就截取你那段这样编译了下,编译通过,运行通过,调试(T,G)通过,如下:
data segment
db 'welcome to masm'
data ends
stack segment
db 32 dup (0)
stack ends
assume cs:code,ds:data,ss:stack
code segment
abc:
mov ax,stack
mov ss,ax
mov sp,16 h   ;(这段代码一用就不能正常显示)
mov ax,data
mov ds,ax
mov ax,9100h
push ax
mov ax,7100h
push ax
mov ax,1500h
push ax
mov cx,3

mov ax,4c00h   ;程序结束必要的,就加上
int 21h

code ends
end   abc

#1


这么含糊?。。。谁知道你问题出在哪呢?
不妨把代码贴出来让大家帮你看看。。。

#2


data segment
db 'welcome to masm'
data ends
stack segment
db 16 dup (0)
stack ends
assume cs:code,ds:data,ss:stack
code segment
(mov ax,stack
 mov ss,ax
 mov sp,16)(这段代码一用就不能正常显示)
 mov ax,data
mov ds,ax
mov ax,9100h
push ax
mov ax,7100h
push ax
mov ax,1500h
push ax
mov cx,3
s:mov bp,0
  pop ax
  push cx
  mov cx,15
(后面都没问题,感觉就前面出问题了)

#3


你尝试用没用debug但不跟踪是什麽效果?

#4


我就在debug中用g命令直接运行的要不看不到效果我一加那三行代码就是无效cpu指令,不加可以正常运行

#5


去掉那3行就可以了吗???
估计也G不了!
我以初学者的初步看法:认为你这种情况要指明程序入口及结束点。。。
也就是说在第一条指令(mov ax,stack)前面要加个标号,END(结尾处)后面也把这个标号注上.应该就可以了。。。

#6


将声明 stack segment改为stack segment stack应该就没问题了 我只知道这样用 原因就不知道了 也期望高手们回答 解我心中的迷惑

#7


段定义的一般格式如下:
 
 段名 SEGMENT [对齐类型] [组合类型] [类别] 
… 
段名 ENDS 

组合类型(COMBINE)
组合类型是告诉连接程序如何把不同模块中段名相同的段合并在一起。具体的组合类型如下:

NONE 表示当前段在逻辑上独立于其它模块,并有其自己的基地址。NONE是缺省的组合类     型。
 
PUBLIC 表示当前段与其它模块中同段名的PUBLIC类型段组合成一个段。组合的先后次序取决于LINK程序中目标模块排列的次序。在组合时,后续段的起始地址要按其对齐类型进行定位,所以,同名段之间可能有间隔。 

COMMON 表示当前段与其它模块中同名段重叠,也就是说,它们的起始地址相同。最终段的长度是同名段的最大长度。由于段覆盖,所以,前一同名段中的初始化数据被后续段的初始数据覆盖掉。 

STACK 组合类型STACK表示当前段是堆栈栈,其组合情况与PUBLIC相同。 

AT 数值表达式 该数值表达式是当前段所指定的绝对起始地址的段地址。 



类别(CLASS)
类别是一个由程序员指定的用单引号括起来的字符串。如果一个段没有给出类别,那么,这个段的类别就为空。类别是用于段的分类,连接程序利用该类别来调整同名、同类别的段,并使它们相邻。典型的类别是"Data"和"Code"。如果指定某段的类别是"Code",那么,该段最好是代码段,这样,有的调试程序(如:CodeView)就可以顺序工作。

希望对你有帮助

#8


引用 4 楼 findstr 的回复:
我就在debug中用g命令直接运行的要不看不到效果我一加那三行代码就是无效cpu指令,不加可以正常运行


上面说的目的是:首先在运行或调试程序时要把CS:IP调整到指向首个指令。。。如你这个,很可能就将DS和SS内的信息也被作为指令了(里面的信息会以什么样的指令形式表现很不确定)。那么一运行或调试,IP难保不乱跑。出错就在所难免了。
你可以试试在DEBUG下,首先把IP手工修改指向mov ax,stack 那,再调试,我初步估计首先IP要被调整为20H才能指向mov ax,stack 处。。。
你自己多调试下看看。。。!

另外因为你的代码不全,后面看不到。在提示下,你自己再调试下。
就是把
stack segment
db 16 dup (0)  ;改大点,如:DB 32 DUP (0)
stack ends 
也可以把
mov ax,stack
mov ss,ax
mov sp,16 ;改为mov sp,16 H这里的疑点也很大,或者SP在STACK改大的情况下再改大一点。。。
再试试。。。
我自己就截取你那段这样编译了下,编译通过,运行通过,调试(T,G)通过,如下:
data segment
db 'welcome to masm'
data ends
stack segment
db 32 dup (0)
stack ends
assume cs:code,ds:data,ss:stack
code segment
abc:
mov ax,stack
mov ss,ax
mov sp,16 h   ;(这段代码一用就不能正常显示)
mov ax,data
mov ds,ax
mov ax,9100h
push ax
mov ax,7100h
push ax
mov ax,1500h
push ax
mov cx,3

mov ax,4c00h   ;程序结束必要的,就加上
int 21h

code ends
end   abc