社区
汇编语言
帖子详情
请问大吓:asm32的精髓是什么?
runner001_cn
2003-02-06 10:56:47
小弟最近学习完asm16,感慨颇深,有萌发学习asm32的感想,但是学了好几天,没有一点头绪。特请教:
1.asm32与asm16的差别在哪?
2.asm32与winasm的联系与区别?
3.asm16现在还有没有用?(从现代软件工程的角度)
4.asm32的特点(概念上的)
5.能否写一个典型的asm32程序,并作分析?
多谢!新年快乐!
...全文
207
21
打赏
收藏
请问大吓:asm32的精髓是什么?
小弟最近学习完asm16,感慨颇深,有萌发学习asm32的感想,但是学了好几天,没有一点头绪。特请教: 1.asm32与asm16的差别在哪? 2.asm32与winasm的联系与区别? 3.asm16现在还有没有用?(从现代软件工程的角度) 4.asm32的特点(概念上的) 5.能否写一个典型的asm32程序,并作分析? 多谢!新年快乐!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
21 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
gudufeixiang
2003-02-28
打赏
举报
回复
gz
runner001_cn
2003-02-28
打赏
举报
回复
还是不很懂!
紫郢剑侠
2003-02-19
打赏
举报
回复
GZ
maja
2003-02-18
打赏
举报
回复
;================================
; 本例摘自《WinAsm32》翻译:Lxx
;================================
.386
.model flat, stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
includelib kernel32.lib
include \masm32\include\user32.inc
includelib user32.lib
.data
MsgCaption db "Iczelion's tutorial no.2",0
MsgBoxText db "Win32 Assembly is Great!",0
.code
start:
invoke MessageBox, NULL,addr MsgBoxText, addr MsgCaption, MB_OK
invoke ExitProcess,NULL
end start
;================================
我先把框架程序放在下面,然后我们再向里面加东西。
.386
.model flat, stdcall
.data
.code
start:
end start
应用程序的执行是从 END 定义的标识符后的第一条语句开始的。在上面的框架程序中就是从 START 开始。程序逐条语句执行一直到遇到 JMP,JNE,JE,RET 等跳转指令。这些跳转指令将把执行权转移到其他语句上,若程序要退出 Windows,则必须调用函数 ExitProcess。
ExitProcess proto uExitCode:DWORD
上面一行是函数原型。函数原型会告诉编译器和链接器该函数的属性,这样在编译和链接时,编译器和链接器就会作相关的类型检查。 函数的原型定义如下:
FunctionName PROTO [ParameterName]:DataType,[ParameterName]:DataType,...
简言之,就是在函数名后加伪指令PROTO,再跟一串由逗号相隔的数据类型链表。在前面的 ExitProcess 定义中,该函数有一个 DWORD 类型的参数。当您使用高层调用语句 INVOKE 时,使用函数原型定义特别有用,您可以简单地认为 INVOKE 是一个有参数类型检查的调用语句。譬如,假设您这样写:
call ExitProcess
若您事先没把一个DWORD类型参数压入堆栈,编译器和链接器都不会报错,但毫无疑问,在您的程序运行时将引起崩溃。但是,当您这样写:
invoke ExitProcess
连接器将报错提醒您忘记压入一个 DWORD 类型参数。所以我建议您用 INVOKE 指令而不是CALL去调用一个函数。INVOKE 的语法如下:
INVOKE expression [,arguments]
expression 既可以是一个函数名也可以是一个函数指针。参数由逗号隔开。大多数API函数的原型放在头文件中。 如果您用的是 hutch 的 MASM32,这些头文件在文件夹MASM32/include 下, 这些头文件的扩展名为 INC,函数名和 DLL 中的函数名相同,譬如:KERNEL32.LIB 引出的函数 ExitProcess 的函数原形声明于kernel.inc中。您也可以自己声明函数原型。 在我的教学课程中都使用 hutch 的windows。inc,这些头文件您可以从http://win32asm.cjb.net下载。
好,我们现在回到ExitProcess 函数,参数uExitCode 是您希望当您的应用程序结束时传递 Windows 的。 您可以这样写:
invoke ExitProcess,0
把这一行放到开始标识符下,这个应用程序就会立即退出 Windows,当然毫无疑问个应用程序本身是一个完整的 Windows 程序。
xingzhou
2003-02-18
打赏
举报
回复
test
yqiong
2003-02-18
打赏
举报
回复
保护模式,WINDOWS API。
zengpan_panpan
2003-02-16
打赏
举报
回复
在现在的windows上写asm本来就是asm32了。
除非你要回到过去,一定要在DOS上写32位程序。
最简单的就是做成flat模式的,不分页,单任务。
5,6年前写过代码早就不知道扔哪去了。
只能说一下要点。
首先要定义两个段
code16 semgent use16
code16 ends
code32 segment use32
entry_32:
code32 ends
16位段里面做初始化。
先LGDT装载全局描述符表,接下来把CR0设置成1,用个短jmp跳转到下一条语句,然后用个long jmp跳转到code32。麻烦在于不能用符号描述code32的地址,例如在code32里面用标号entry_32定义个入口,跳转到那个标号。简单做法是把CS段的描述符的基地址定义成0,大小定义为4G,然后在程序运行时根据当前的16位情况下的段地址和entry_32计算出对应的32位偏移量。然后对CS选择子和算出的偏移量作一个长跳转,不幸的是masm,tasm都不能写出那样的汇编指令,必须用DB伪指令直接定义长跳转指令的机器码。进入32位段后就可以根据GDT中定义的其它段描述符选择子初始化其它段寄存器,然后就是你的32位程序了。
不过DOS下自己写的32位程序几乎什么都不好做,任何一个中断你都不能调用,要显示点东西只有自己去直接写屏幕了。
如果上面的简单的程序弄出来了,就可以考虑一下使用分页,关键就在于地址空间的计算,定义好两级页表后,装载CR3,给CR3的值应该是页表所在的物理地址,就是4G线性空间内的那个偏移。不能搞错了。
还想弄点简单的多任务,就该使用时钟中断了,这个时候不要忘了设置好IDT,这个东西的配置还算简单,然后就是LDT,为了简单也可以不要直接使用GDT里面的定义就好,最麻烦的是TSS,对于每个任务,原则上应该有各自的页表,每个任务都让它从0地址开始。作为实验做两个就好互相跳转。跳转还是用长跳转,和进入保护模式的那个跳转一样,必须用DB定义,段选择子就是TSS的选择子,32位偏移量无所谓,一般都填成0,因为跳转以后的EIP是从TSS里面取出来的,也就是上次离开该任务的指令的下一条指令的地址。定义TSS的时候不要忘了存储浮点状态的空间,记得FSAVE,返回以后记得FRESTORE,这两条指令后不要忘了FWAIT。
一定要调BIOS中断,要么就进V86,要么暂时切换回实模式。如果要写成V86模式的,千万小心页表定位,必须把BIOS程序所在的位置保留在原来的位置上。
这些东西玩玩就好了,没有必要在上面浪费时间,反正又不用去写操作系统,16位模式照样可以用32位寄存器,算点东西就将就了。
runner001_cn
2003-02-16
打赏
举报
回复
有专业级选手吗?
runner001_cn
2003-02-11
打赏
举报
回复
好象还是不大明白!:(..
紫郢剑侠
2003-02-10
打赏
举报
回复
asm32与asm16的差别在哪?
我觉得在于内存管理方式,任务管理方式.
asmzyd
2003-02-09
打赏
举报
回复
考,说白了,所有的设计语言都是扯淡,就象人一样,有白人,有黑人,有黄人,都是人,只是肤色不同。要找老婆嘛就看你喜欢什么颜色了。
showmetheway
2003-02-09
打赏
举报
回复
同意最后四个字:)
hswxf
2003-02-08
打赏
举报
回复
asm32比16多了一些新的数据结构,而且有一些所谓的环境加了一些庫,如果是初学,不要去弄这些新的库,应该以16为基础,熟习一下ASM32的特点,然后再此基础上去全面使用32位,这些学习与一些所谓的WIN32并无冲突,如果学的好的话,你会感到这些原理级的语言的好处的,仅供参考
runner001_cn
2003-02-08
打赏
举报
回复
作为楼主,我希望大家能给点实质意见,也让小弟少走弯路。再次谢谢!
showmetheway
2003-02-07
打赏
举报
回复
没学过,asm32难学吗?
大概要学多久?
natureshuo
2003-02-06
打赏
举报
回复
保护模式--最大的差异
sjd163
2003-02-06
打赏
举报
回复
16位学好了,32就容易了
odaliu
2003-02-06
打赏
举报
回复
从16->32和从32->64会不会有些地方相似呢??
giantzz
2003-02-06
打赏
举报
回复
楼上真牛!
64位???
Intel的64位是安腾体系结构,且有EPIC技术笼罩
AMD的64位(K8)是80X86体系结构.
两个处理器是不一样的体系结构,大家会选哪一家的(这是AMD的最后决战),据说AMD的会在今年第一季度上市for PC版本的.其实早该上市了,只是AMD一味追求高主频,而Intel的64位900MHz就敢上市,一个玩市场,一个玩技术.
cuiyuting
2003-02-06
打赏
举报
回复
……
1.我只知道asm
2.同上
3.如果asm16指的是x86实模式汇编的话,那么答案就是很少,可能只用在操作系统初始化上。
4.如果asm32指的是x86保护模式汇编的话,那么答案就是……保护模式(东西太多了,自己看书吧)
5.……不能:P
64位汇编……谁给我买个64位计算机我就去学。
如果你只打算做应用程序开发的话,那么精髓就是相应系统(操作系统)的sdk
加载更多回复(1)
学会批处理
function StorePage(){d=document;t=d.selection?(d.selection.type!=None?d.selection.createRange().text:):(d.getSelection?d.getSelection():);void(keyit=window.open(http://www.365key.com/storeit.
转自网络
终极dos批处理循环命令详解 格式:FOR [参数] %%变量名 IN (相关文件或命令) DO 执行的命令 作用:对一个或一组文件,字符串或命令结果中的每一个对象执行特定命令,达到我们想要的结果。 注意:在批处理文件中使用 FOR 命令时,指定变量请使用 %%variable,而不要用 %variable。变量名称是区分大小写的,所以 %i 不同于 %I. 关于:for...
bat批处理教程 02
为什么会把批处理和爱情扯上关系?不是我无聊,也不是因为这样写有趣多少,原因有二:其一,批处理和爱情有很多相同的地方,有些地方我用“专业”的行话解释不清(我不怀疑自己的表达能力,而是事情本身就不好说清楚),说了=没说,但用地球人都知道的爱情一比喻(爱情是什么?我**怎么知道!!),没准你心里一下就亮堂了,事半功倍,何乐而不为?其二,我这段时间状态不是很好,感冒发烧头疼鼻塞,但主要还是感情上精神摧残,...
系统调用
1什么是系统调用 系统调用,顾名思义,说的是操作系统提供给用户程序调用的一组“特殊”接口。用户程序可以通过这组“特殊”接口来获得操作系统内核提供的服务,比如用户可以通过文件系统相关的调用请求系统打开文件、关闭文件或读写文件,可以通过时钟相关的系统调用获得系统时间或设置定时器等。从逻辑上来说,系统调用可被看成是一个内核与用户空间程序交互的接口——它好比一个中间人,
【转载】bat批处理教程 作者:hipi 日期:2006-11-05
编者注:这是我十多年前学习批处理时找到的一篇入门教程。原作者以聊天的语气讲解批处理,算得上是一篇好文章。时过境迁,我已找不到原博文地址了,但文字版的博文被我保留在txt文本中。txt版丢失了段落格式,现在我重新整理了一下,发出来重温,有缘自取。 bat批处理教程作者:hipi 日期:2006-11-05 第一章 这是一篇技术教程,我会用很简单的文字表达清楚自己的意思,你要你识字就能看...
汇编语言
21,458
社区成员
41,603
社区内容
发帖
与我相关
我的任务
汇编语言
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
复制链接
扫一扫
分享
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章