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

findstr 2009-08-10 10:24:40
我用80x86汇编语言,我利有mov指令向显存中写入不同格式数字来直接显示数字,可以把数字格式正常压入栈中,但我不能使有mov ax,stack mov ss,ax mov sp,16指令(stack为栈段),否则不能正常显示数字,请高手予以解答,感激不尽.
...全文
107 8 打赏 收藏 转发到动态 举报
写回复
用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,16H这里的疑点也很大,或者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,16h ;(这段代码一用就不能正常显示)
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
  • 打赏
  • 举报
回复
这么含糊?。。。谁知道你问题出在哪呢?
不妨把代码贴出来让大家帮你看看。。。
简介:SourceFormatX 源代码美化工具是一款专业的 多语言 源码美化工具, 源代码格式化工具, 源代码缩进排版工具 和企业级源代码风格统一化解决方案。其可以按照预设或自定义的源码风格全自动、大批量、精细地美化 C, C++, Java, C#, D Language, Pascal (Delphi), Visual Basic, VB.NET, VBScript, JavaScript (JScript), PHP, ASP, JSP, HTML, XML, HTML Components, CORBA IDL, 80x86 ASM, 8051 ASM 汇编等编程语言源代码。 拥有 SourceFormatX, 您可以在数秒种之内将任何源代码美化和转换成您最喜爱的代码风格或您开发团队的标准编码规范! 说明:终于找到 SourceFormatX 2.56 的注册破解版了。源代码美化工具SourceformatX破解版,一个传说中不可能被破解的东东,现在完美破解了!!不管你是程序开发者,还是网页设计者,SF都能把你的凌乱代码规矩排列,值得收藏!! 附加: 【软件名称】: SourceFormatX 2.56 【使用工具】: Fi,Ollydbg,ImportREC 【破解平台】: Win2K Server 【软件简介】: SourceFormatX 是一个强大的源代码自动格式化,缩进,排版,美化工具。 它可以格式化 C, C++、Java、C#、Object Pascal、PHP、ASP、JSP、VB、 VB.NET、VBScript、JavaScript 和 HTML Components源代码。 它还可以将源代码输出为语法高亮显示的 HTML 或 RTF 文件。 【软件大小】: 731 KB 【编写语言】: Borland Delphi 5 【加壳方式】: PECompact 1.68 - 1.84 【保护方式】: 文件验证(License.dat)。 破解行为会激活恶意代码, 主要是删注册表的HKEY_CLASSES_ROOT整个分支。 删注册表是用RegDeleteValueA 。 作者把关键代码做成一个DLL, 将DLL文件的16进制码加密后生成一个注册文件, 密匙产生函数的参数是主程序加壳后的HASH码和机器信息。 已注册用户验证注册码时,先验证有没有文件, 没有文件则自然受限制的功能无法使用。 如果有注册文件,解密后即生成一个小临时文件。 如果主程序被脱壳或者被修改(爆破),自然Hash值密码不符, 解密出来的肯定都是垃圾码,没有一点用处。 只有没有被修改的主程序才能正确地解码, 而且当然只有解密正确的文件才是一个真正的DLL文件, 才能被GetProcAddress函数找到欲调用的关键函数地址。 这样只有注册用户能正常使用了。 【破解建议】: 安装 VMware ,否则, 作者很生气, 后果很严重 :) 【软件下载】: http://wh.onlinedown.net:88/down/sourceformatx256cn.exe /***********************************脱壳**************************************/ ; 跟踪到00625556处 00625556 C2 0400 retn 4 ; 此处就是OEP,记得脱壳后重建输入表,我用的是ImportREC 00573258 55 push ebp /********************************去掉OD检查***********************************/ ; 调用检查OD的函数 0057330F E8 002EFEFF call SourceFo.00556114 ... ... ; 将这里的 机器码 74(jz) 修改为 EB(jmp) 0055614C 74 23 jz short upSource.00556171 ; 调用检查OD的函数 005774EA E8 CDB4FFFF call SourceFo.005729BC ; 将这里的 机器码 74(jz) 修改为 EB(jmp) 005729F2 74 42 je short SourceFo.00572A36 ; 将这里的 机器码 74(jz) 修改为 EB(jmp) 0055F076 74 42 je short SourceFo.0055F0BA /*****************************去掉文件修改检查********************************/ ; 检查执行程序是否被修改 005774F4 E8 97B1FFFF call SourceFo.00572690 ; 将这里的 机器码 74(jz) 修改为 EB(jmp) 005723AC 74 55 je short SourceFo.00572403 ; 0044EA65 E8 A69BFFFF call SourceFo.00448610 0044861D 74 17 je short SourceFo.00448636 /*******************************去掉DeDe检查**********************************/ ; 将这里的 机器码 74(jz) 修改为 EB(jmp) 005727F4 74 28 je short SourceFo.0057281E 0055641C 74 28 je short SourceFo.00556446 /*****************************去掉Filemon检查*********************************/ ; 将这里的 机器码 74(jz) 修改为 EB(jmp) 005560C4 74 20 je short SourceFo.005560E6 /*****************************去掉Snacker检查*********************************/ ; 将这里的 机器码 74(jz) 修改为 EB(jmp) 005560ED 74 20 je short SourceFo.0055610F /*************************其他各类调试软件的驱动句柄检测**********************/ 00573314 E8 632CFEFF call SourceFo.00555F7C ; 关键CALL, 以 eax 传递参数, 005774EF B8 54885700 mov eax,SourceFo.00578854 ; ASCII "License.dat" 005774F4 E8 97B1FFFF call SourceFo.00572690 /****************************执行文件尺寸检查*********************************/ 0055F105 |. 6A 00 push 0 ; /pFileSizeHigh = NULL 0055F107 |. 8B45 FC mov eax,dword ptr ss:[ebp-4] ; | 0055F10A |. 50 push eax ; |hFile 0055F10B |. E8 D477EAFF call ; \GetFileSize ; 将这里的 机器码 3D A8421200 修改为 3D 00E02200(00902200) 0055F110 |. 3D A8421200 cmp eax,1242A8 0055F115 |. 7E 1F jle short SourceFo.0055F136 // ??? 0055EF71 75 1C jnz short SourceFo.0055EF8F /******************************修理非法用户***********************************/ 0055F117 |> /6A 03 /push 3 0055F119 |. |B8 B8F45500 |mov eax,SourceFo.0055F4B8 ; ASCII "048229125055114025094102049210040021027068051099091168132234034161018208011" 0055F11E |. |8D55 E8 |lea edx,dword ptr ss:[ebp-18] 0055F121 |. |E8 9625EFFF |call SourceFo.004516BC 0055F126 |. |8B45 E8 |mov eax,dword ptr ss:[ebp-18] 0055F129 |. |E8 124FEAFF |call SourceFo.00404040 0055F12E |. |50 |push eax ; |CmdLine 0055F12F |. |E8 4079EAFF |call ; \WinExec 0055F134 |.^\EB E1 \jmp short SourceFo.0055F117 ; 循环打开多个窗口 /****************************可疑*******************************/ 00412F4D |. 807D FF 00 cmp byte ptr ss:[ebp-1],0 00412F51 |. 74 0F je short SourceFo.00412F62 00412F53 |. E8 5803FFFF call SourceFo.004032B0 0041A524 |. 8D45 D4 lea eax,dword ptr ss:[ebp-2C] 0041A527 |. 50 push eax ; /pSystemInfo 0041A528 |. E8 0FC4FEFF call ; \GetSystemInfo 0041A52D |. 8B55 FC mov edx,dword ptr ss:[ebp-4] 0041A530 |. 8B4D F8 mov ecx,dword ptr ss:[ebp-8] 0041A533 |. 49 dec ecx 0041A534 |. 78 33 js short SourceFo.0041A569 0041A536 |. 8D45 D4 lea eax,dword ptr ss:[ebp-2C] 0041A539 |. 66:8378 20 03 cmp word ptr ds:[eax+20],3 0041A53E |. 74 10 je short SourceFo.0041A550 ; ??? 00412F21 |. 837B 04 00 cmp dword ptr ds:[ebx+4],0 00412F25 |. 7D 24 jge short SourceFo.00412F4B ; ??? 00412F4D |. 807D FF 00 cmp byte ptr ss:[ebp-1],0 00412F51 |. 74 0F je short SOURCEFO.00412F62 00412F53 |. E8 5803FFFF call SOURCEFO.004032B0 ; eax = "0123456789abcdeffedcba9876543210" 005096B0 |. 8D45 A4 lea eax,dword ptr ss:[ebp-5C] 005096B3 |. E8 3CFFFFFF call SourceFo.005095F4 ; 将这里的 机器码 3D 508D0F00 修改为 3D 00902200 00564168 . 3D 508D0F00 cmp eax,0F8D50 0056416D . 0F8E F7000000 jle SourceFo.0056426A 00564173 . 33D2 xor edx,edx ; 将这里的 机器码 3D 5F890F00 修改为 3D 00902200 00567DFC . 3D 5F890F00 cmp eax,0F895F 00567E01 . 7E 13 jle short SOURCEFO.00567E16 00567E03 . E8 50DDFEFF call SOURCEFO.00555B58 ; ??? 在打开文件License.dat之后多次调用 00412F53 |. E8 5803FFFF call SOURCEFO.004032B0

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧