windows操作系统的运行机制.高手请进!在线!

andy_jqh 2002-12-17 06:47:28
请问在特定的操作系统下比如 windows编写应用程序开发软件怎么做?
比如delphi,vc,c++bulder这些 地层是怎么做的呢?,是不是用纯粹的汇编能够做出来么?winapi的引用是不是要封装windows sdk 呢?自己的编译器要封装sdk才能够编译sdk对么? java最初是不是用什么做的?
...全文
190 36 打赏 收藏 转发到动态 举报
写回复
用AI写文章
36 条回复
切换为时间正序
请发表友善的回复…
发表回复
andy_jqh 2003-01-09
  • 打赏
  • 举报
回复
辛苦贴汇编代码的兄弟辛苦了,这些我都知道
如果我自己打造编译器
我的编译器怎么去解析这个呢?
INCLUDE \masm32\INCLUDE\gdi32.inc 实现这个引用呢?怎么找到呢?
wylpro 2003-01-08
  • 打赏
  • 举报
回复
这方面你要找PE微软格式资料看,或者到看雪学院去学。
www.pediy.com
zhumao 2003-01-08
  • 打赏
  • 举报
回复
.386
.model flat,stdcall
option casemap:none

INCLUDE \masm32\INCLUDE\windows.inc
INCLUDE \masm32\INCLUDE\user32.inc
INCLUDE \masm32\INCLUDE\comdlg32.inc
INCLUDE \masm32\INCLUDE\gdi32.inc
INCLUDE \masm32\INCLUDE\kernel32.inc
includelib \masm32\lib\gdi32.lib
includelib \masm32\lib\comdlg32.lib
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib

.data
lpText db 'hello world',0
lpCap db 'caption',0

.code
start:
push 0
push offset lpCap
;从右到左,注意跟上面的一个不同
push offset lpText
push 0
call MessageBox
push 0
call ExitProcess
end start
---------
编译 & 链接
c:\masm32\bin\ml /c /coff /Zi test.asm
c:\masm32\bin\link /subsystem:windows /libpath:c:\masm32\lib test.obj
andy_jqh 2003-01-07
  • 打赏
  • 举报
回复
wylpro() 有没有什么书推荐一下?
wylpro 2003-01-07
  • 打赏
  • 举报
回复
还有就是编译器是用C/C++或其他语言做的。
第一代汇编编译器是用机器码做的。
第二代汇编编译器是用第一代汇编语言做的。
第一代高级语言是用汇编语言作的。
第二代高级语言是用第一代高级语言作的。如C可能是用 B/PASCAL 加部分汇编做的。
现在的编译器几乎不用汇编,完全用高级语言的效果更好。但是游戏,操作系统由于运行性能的问题有一半要用到汇编。(编译器的运行速度已没有早期那么重要了。
wylpro 2003-01-07
  • 打赏
  • 举报
回复
你说的问题是比较复杂的。牵扯的东西太多。代码内的函数调用是靠偏移定位算出来的。不知你学过机器码没有?如果学过就知道地址是如何换算的。而API不一样,
它其实就是DLL中的函数。是动态加栽的,无确定地址。PE结构中指明映射表。该结构一般存于.idata段中。叫IMAGE_IMPORT_DESCRIPTOR结构:
Dword Characteristics
Dword TimeDataStamp
Dword ForwarderChain
Dword Name
PIMAGE_THUNK_DATA FirstThunk
如:
Name项指向->"User32.DLL"
FirstThunk指向Import Address Table
Import Address Table指向 75H "LoadIcon" 66H "GetMessage" 等等。
装载器动态修改Import Address Table,完成加载任务。程序中的Call dword ptr [xxxxxxxx] 才能正确执行。反编译时才能显示Call dword ptr [xxxxxxxx] (GetMessage)
至于obj不管那些,只正确填写引用函数名称即可。
传参是在C/C++编译中按声名格式压栈的。汇编下就只能自己传参了。
andy_jqh 2003-01-07
  • 打赏
  • 举报
回复
up
andy_jqh 2002-12-30
  • 打赏
  • 举报
回复
up?
msadmin 2002-12-30
  • 打赏
  • 举报
回复
WINDOWS.inc定义了WIN32 API中很多的参数和数据结构,
其他的.inc文件则是不同DLL中的WIN32 API函数声明。

导入库:LIB库文件中只需要包含函数在DLL中的位置信息,不再有二进制代码部分。
andy_jqh 2002-12-30
  • 打赏
  • 举报
回复
你顶不起来是吧?
COWLORD 2002-12-30
  • 打赏
  • 举报
回复
靠别人不如靠自己,别顶鸟。
andy_jqh 2002-12-27
  • 打赏
  • 举报
回复
clumsy(希望, 你可还在?)
你所说的(我不是科班出身, "编译原理" 虽也看过, 现在却又一片空白了. )中 我知道一点点
我是想问 编译器是怎么具体实现 那些功能的
andy_jqh 2002-12-27
  • 打赏
  • 举报
回复
xiangqian(天阁流云) ----

对某些东西感兴趣而已 我当然不是要编写什么编译器 只是希望了解一些而已
真搞不懂 为什么都认为我要搞什么编译器
ckhitler 2002-12-24
  • 打赏
  • 举报
回复
up
clumsy 2002-12-24
  • 打赏
  • 举报
回复
xiangqian(天阁流云) :

>> win32 api都在内存里
并不是所有的win32 api都已经在内存里, 况且编译和链接程序只要知道引用的函数的实际函数名和所在的dll的文件名就可以创建Import节了, 即使那样的信息是错误的(这可能是用户定义的错误, 或者是dll版本的错误造成的), 当然这样的错误会导致最终的exe不能正常工作.

>> 是什么程序找main入口函数、为什么要叫main而不能叫其他名字
main只是c语言定义的一个标准的主程序入口的函数名, 在asm中, 程序设计者可以用end语句定义任意的函数名或标号作为程序的入口. 即使是在c中, 这个main的名称也是可以改变的.

>> 什么程序在windows中做pe loader把执行文件mapview进内存、
>> 保护模式怎么给每个进程分配独立的内存页
我觉得做编译程序并不必须了解这些, 虽然掌握os对内存的管理模式对代码的优化是必须的.
clumsy 2002-12-24
  • 打赏
  • 举报
回复
我不是科班出身, "编译原理" 虽也看过, 现在却又一片空白了.

如果能够判定它是引自某个dll(这可从.inc或源文件的预定义中得知), 应将其放到Import名字列表中, 否则是在外部变量名(在其它的.obj中定义)列表中. 最后在链接时由各个模块创建exe的Import节, 检验外部变量的引用并填入适当的引用地址. 为了使用者的方便, 上面的两个表是一定要创建的.
xiangqian 2002-12-24
  • 打赏
  • 举报
回复
win32 api都在内存里,这就足够了,dll文件里有api的code,dll又被影射在内存里,dll又是以pe格式map在内存里,知道了pe的格式你就知道怎么换算地址偏移,就知道怎么从exports表里找api名,就知道call后面的地址是和当前eip怎么加减出的实际偏移。想写编译器,要先从语义语法分析开始,最后才到汇编生成和cpu指令机器码转译、优化,想问你一句,你知道是什么程序找main入口函数、为什么要叫main而不能叫其他名字,什么程序在windows中做pe loader把执行文件mapview进内存、保护模式怎么给每个进程分配独立的内存页么?如果你不知道,请从眼前做起,别这么早定那么高的目标
andy_jqh 2002-12-24
  • 打赏
  • 举报
回复
?
andy_jqh 2002-12-22
  • 打赏
  • 举报
回复
我没有学过编译原理,比如有人要自己写编译器,这个编译器遇到了这个外部函数名然后 怎么执行呢?比如楼上的
.data
lpText db '开心',0
lpCap db 'caption',0

.code
start:
push 0
push offset lpText
push offset lpCap
push 0
call MessageBox
push 0
call ExitProcess
end start


你自己编写的编译器遇到这个“MessageBox”后以下怎么走?

clumsy 2002-12-21
  • 打赏
  • 举报
回复
即使是自己想写一套编译器, 也是要了解Windows的那些API的调用规范的, 主要是返回类型以及参数的个数和类型, 具体这些函数的实现是由Windows进行的, 和你就没有关系了, 至少是你尽可能多地向用户提供这些信息, 这些信息就包含在两个文件里: 一是.inc文件, 其中定义了相应的API函数的参数的个数和类型以及函数自身的返回类型, 还有就是说使用到的常量和数据结构的定义, 此文件主要供编译器确定程序中函数的调用是否符合要求, 并确定它们的外部函数的身份; 二是.lib文件, 这个文件中包含的是对应的API函数是在那个dll文件里, 其在dll中的内部名是什么, 此文件主要供链接程序创建PE文件的Import节, 在windows中运行一个程序时, 系统就是通过你的程序的Import节中的信息去预先装载相应的dll文件, 并根据你的exe的Import节中的函数名到dll文件的Export节中去匹配确定此函数的入口地址的.
如果要自写编译器, 还应考虑一个情况, 就是对那些你不了解的函数(以及不公开的函数和新的及其它的如用户自己创建的函数)的引用提供一个方法, 主要的还是和上面的一样, 一是函数的调用规范, 二是函数在哪个dll中及其内部函数名, 应该给用户提供函数的引用名和内部名可以不同的功能, 这样会带来不少的方便.
加载更多回复(16)

21,459

社区成员

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

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