请问大吓: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 打赏 收藏 转发到动态 举报
写回复
用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)

21,458

社区成员

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

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