社区
汇编语言
帖子详情
80x86汇编语言不能正常显示
findstr
2009-08-10 10:24:40
我用80x86汇编语言,我利有mov指令向显存中写入不同格式数字来直接显示数字,可以把数字格式正常压入栈中,但我不能使有mov ax,stack mov ss,ax mov sp,16指令(stack为栈段),否则不能正常显示数字,请高手予以解答,感激不尽.
...全文
117
8
打赏
收藏
80x86汇编语言不能正常显示
我用80x86汇编语言,我利有mov指令向显存中写入不同格式数字来直接显示数字,可以把数字格式正常压入栈中,但我不能使有mov ax,stack mov ss,ax mov sp,16指令(stack为栈段),否则不能正常显示数字,请高手予以解答,感激不尽.
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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
平台上的系统实现方法,对系统的启动原理的总结
电子信息工程
汇编语言
课程设计
附有流程图、总结、设计方案、设计要求、设计截图 附录: 源程序 .model small .stack .data oldcur dw ? OLD1C DW 2 DUP(?) .code ;代码段 .startup jmp go NEWINT1C: PUSHF ;标志进栈 CALL DWORD PTR CS:OLD1C push ax PUSH BX PUSH CX PUSH DX XOR BH,BH ;异或,清零 MOV AH,3 ;读取光标位置 INT 10H MOV CS:OLDCUR,DX MOV AH,1 ;1号功能调用,置光标位置 and bh,0 MOV DX,45h INT 10H MOV AH,2 ;读取系统时钟 出口参数分别CH:CL:DH INT 1AH PUSH DX PUSH CX POP BX PUSH BX CALL SHOWBYTE ;调用 SHOWBYTE,
显示
小时 (转换成ASC码输出) CALL SHOWCOLON ;调用 SHOWCOLON
显示
: POP BX XCHG BH,BL ;数据交换 CALL SHOWBYTE ;
显示
分钟 (转换成ASC码输出) CALL SHOWCOLON ;
显示
: POP BX CALL SHOWBYTE ;
显示
秒 MOV DX,CS:OLDCUR ;保存原来光标位置 MOV AH,2 ;恢复原光标位置 XOR BH,BH INT 10H POP DX POP CX POP BX POP AX IRET SHOWBYTE PROC NEAR
微机原理,汇编,接口技术课程设计,交通灯
微机原理 汇编 接口技术 课程设计,交通灯模拟实现。。
DOSBox软件.zip
dosbox软件-汇编dosbox软件-汇编
汇编语言
21,497
社区成员
41,618
社区内容
发帖
与我相关
我的任务
汇编语言
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
复制链接
扫一扫
分享
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章