社区
汇编语言
帖子详情
80x86汇编语言不能正常显示
findstr
2009-08-10 10:24:40
我用80x86汇编语言,我利有mov指令向显存中写入不同格式数字来直接显示数字,可以把数字格式正常压入栈中,但我不能使有mov ax,stack mov ss,ax mov sp,16指令(stack为栈段),否则不能正常显示数字,请高手予以解答,感激不尽.
...全文
153
8
打赏
收藏
80x86汇编语言不能正常显示
我用80x86汇编语言,我利有mov指令向显存中写入不同格式数字来直接显示数字,可以把数字格式正常压入栈中,但我不能使有mov ax,stack mov ss,ax mov sp,16指令(stack为栈段),否则不能正常显示数字,请高手予以解答,感激不尽.
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
8 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
findstr
2009-08-11
打赏
举报
回复
我就在debug中用g命令直接运行的要不看不到效果我一加那三行代码就是无效cpu指令,不加可以正常运行
pppskz
2009-08-11
打赏
举报
回复
你尝试用没用debug但不跟踪是什麽效果?
nanlingcg
2009-08-11
打赏
举报
回复
[Quote=引用 4 楼 findstr 的回复:]
我就在debug中用g命令直接运行的要不看不到效果我一加那三行代码就是无效cpu指令,不加可以正常运行
[/Quote]
上面说的目的是:首先在运行或调试程序时要把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
djking1986
2009-08-11
打赏
举报
回复
段定义的一般格式如下:
段名 SEGMENT [对齐类型] [组合类型] [类别]
…
段名 ENDS
组合类型(COMBINE)
组合类型是告诉连接程序如何把不同模块中段名相同的段合并在一起。具体的组合类型如下:
NONE 表示当前段在逻辑上独立于其它模块,并有其自己的基地址。NONE是缺省的组合类 型。
PUBLIC 表示当前段与其它模块中同段名的PUBLIC类型段组合成一个段。组合的先后次序取决于LINK程序中目标模块排列的次序。在组合时,后续段的起始地址要按其对齐类型进行定位,所以,同名段之间可能有间隔。
COMMON 表示当前段与其它模块中同名段重叠,也就是说,它们的起始地址相同。最终段的长度是同名段的最大长度。由于段覆盖,所以,前一同名段中的初始化数据被后续段的初始数据覆盖掉。
STACK 组合类型STACK表示当前段是堆栈栈,其组合情况与PUBLIC相同。
AT 数值表达式 该数值表达式是当前段所指定的绝对起始地址的段地址。
类别(CLASS)
类别是一个由程序员指定的用单引号括起来的字符串。如果一个段没有给出类别,那么,这个段的类别就为空。类别是用于段的分类,连接程序利用该类别来调整同名、同类别的段,并使它们相邻。典型的类别是"Data"和"Code"。如果指定某段的类别是"Code",那么,该段最好是代码段,这样,有的调试程序(如:CodeView)就可以顺序工作。
希望对你有帮助
djking1986
2009-08-11
打赏
举报
回复
将声明 stack segment改为stack segment stack应该就没问题了 我只知道这样用 原因就不知道了 也期望高手们回答 解我心中的迷惑
nanlingcg
2009-08-11
打赏
举报
回复
去掉那3行就可以了吗???
估计也G不了!
我以初学者的初步看法:认为你这种情况要指明程序入口及结束点。。。
也就是说在第一条指令(mov ax,stack)前面要加个标号,END(结尾处)后面也把这个标号注上.应该就可以了。。。
findstr
2009-08-10
打赏
举报
回复
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
(后面都没问题,感觉就前面出问题了)
nanlingcg
2009-08-10
打赏
举报
回复
这么含糊?。。。谁知道你问题出在哪呢?
不妨把代码贴出来让大家帮你看看。。。
80
x86
汇编语言
:
显示
九九乘法表
显示
九九乘法表的最简单
汇编语言
程序
基于
80
x86
汇编语言
的打砖块游戏
经过这次的汇编专题实验之后,我感觉自己对
汇编语言
的理解更加深刻了,上学期的课内实验虽然在一定程度上促进了理论与实践的结合,但是却很有限,而这次的专题实验无论是规模上、难度上,还是老师和我的重视程度上,都是课内实验所
不能
比拟的。实验开始时的选题报告,我经过对多个实验项目进行综合比较,结合自己的实际情况和兴趣爱好,最终选择了经典游戏打砖块。
80
x86
汇编语言
第二章 复习
x86
寻址方式
80
x86
指令中的操作数可以存放在三种不同的部件中:第一种是 CPU 内的寄存器中,第二种是主存中,第三种是 I/O 设备的端口中。寻址方式不仅指明了操作数存放的部件,而且指明了操作数在该部件内的存放地址。
【
80
X86
汇编语言
学习】【字符串处理】字符串操作举例strcat
例子:写一个在字符串1后追加字符串2的子程序。折字符串均为0结尾 DSEG SEGMENT BUFFER1 DB 'Hello World ',0 DB 50 DUP (0) BUFFER2 DB ' Welcome !!!',0 DSEG ENDS CSEG SEGMENT ASSUME DS:DSEG,CS:CSEG START: MOV AX,DSEG
【
80
X86
汇编语言
学习】【字符串处理】字符串操作指令REP
80
X86
汇编提供的字符串操作指令,每次只能处理一个字或字节,所以需要提供一个循环。而
80
86提供了一个“重复前缀”REP,REP重复执行后面的串操作指令, 每一次执行,都先判断CX是否为0,如果CX为0,则结束重复;否则CX 减一,重复其后的串操作指令。 例子:提示输入一个字符,用输入的字符填充缓冲区 ;FILLB ;测试用指定的字符填充指定的缓冲区 DSEG SEGME
汇编语言
21,500
社区成员
41,617
社区内容
发帖
与我相关
我的任务
汇编语言
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
复制链接
扫一扫
分享
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章