关于汇编的几个问题

有以下几个问题,希望高手能一一解答1、系统是用汇编编写的么2、汇编可不可以写可视化的程序,或者3D的3、汇编编译出来的obj文件必须经过连接才可以执行么4、obj可以连接... 有以下几个问题,希望高手能一一解答
1、系统是用汇编编写的么
2、汇编可不可以写可视化的程序,或者3D的
3、汇编编译出来的obj文件必须经过连接才可以执行么
4、obj可以连接成任意可执行文件,实现跨平台么
5、汇编的程序可不可以在没有操作系统的情况下运行,如果可以,怎么运行
就这些了,希望高手解答,能多少是多少。。
展开
 我来答
匿名用户
2013-12-14
展开全部
1:操作系统很庞大,操作系统的引导bootsect这个必须要由汇编来写,不过由于操作系统过于庞大,所以内核就由C(linux系统没有采用一条C++语句,即使是现在的linux内核也没有一条C++语法)来写了,具体的你可以看下Linux源代码,用到汇编的部分只有引导的部分,而那部分只能有汇编来写,这部分包括mbr,因为512B 的mbr每一个字节都有特定作用只能由低级语言来写。
2:只要你问出这个问题,我想你是可能是没有弄清楚汇编的概念,这么跟你说吧, 你在windows上面玩的所有东西,包括你玩的超大型游戏,都可以用汇编来写,虽然实际上这不现实,也没人会这么做。但一个DOS格式文件或者一个WIN32下的PE(exe)文件内部 都是二进制内容是可以反汇编的,里面说白了存储的都是汇编代码(实际上是机器码,但机器码跟汇编代码是一一对应的)
可视化编程吧,汇编是不能实现所见即所得的那种可视化编程的,但是资源还是可以用资源编辑器编写,在链接的时候连接进去。
对于编写可视化程序给你一段代码:

.386
.model flat,stdcall
option casemap:none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include windows.inc
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.data
szCaption db 'A MessageBox !',0
szText db 'Hello, World !',0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code
start:
invoke MessageBox,NULL,offset szText,offset szCaption,MB_OK
invoke ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
end start

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
用下列命令进行编译和链接:
; ml /c /coff Hello.asm
; Link /subsystem:windows Hello.obj
(win32汇编编译环境你可以到网上搜索masm32)
汇编在windows平台下也能调用api。3D效果也都是DX什么这些东西的API 调用出来的!

一句话:高级(其他任何)语言能做的汇编都能做,高级(其他任何)语言不能做的,只有计算机能完成的汇编都能做(比如操作系统引导部分)

3:汇编编译出来的文件obj文件在win32平台下面一般都是COFF文件格式,coff格式百度上有详细介绍
COFF文件跟EXE文件其实很像了,对于特殊的编译选项,比如在写操作系统引导的时候你不需要生成额外的信息,你要的是在目标文件每一个字节处的机器码,即你要精准定位每一行代码 都对应目标文件的位置。这个时候就不需要连接,汇编出来的文件直接裸机就能运行
4:
obj文件在linux上和windows上 都是采用coff格式的。假如linux不用系统调用 windows不用windows api也许 这两个系统的coff文件就完全一样了!不过 在调用系统接口的时候 linux用的是系统调用,windows用的是windows api,即使coff文件格式一样,也不能跨平台,很抱歉!
5:汇编程序能在没有操作系统的情况下运行
你需要一个nasm编译器(貌似现在也只有这个编译器能按指令一行一行编译到目标文件中)
汇编代码如下:

org 07c00h ; 告诉编译器程序加载到7c00处
mov ax, cs
mov ds, ax
mov es, ax
call DispStr ; 调用显示字符串例程
jmp $ ; 无限循环
DispStr:
mov ax, BootMessage
mov bp, ax ; ES:BP = 串地址
mov cx, 22 ; CX = 串长度
mov ax, 01301h ; AH = 13, AL = 01h
mov bx, 000ch ; 页号为0(BH = 0) 黑底红字(BL = 0Ch,高亮)
mov dl, 0
int 10h ; 10h 号中断
ret
BootMessage: db "Powerd By HuangLiuyou"
times 510-($-$$) db 0 ; 填充剩下的空间,使生成的二进制代码恰好为512字节
dw 0xaa55 ; 结束标志

用nasm编译生成一个512字节的obj文件(mbr)
然后用mbr工具什么什么的或者 磁盘编辑工具什么的把这512字节拷贝到0柱面、0磁头、1扇区(一个扇区就是512字节,不要在你的电脑上这么做,你可以把这512字节写到U盘上然后从U盘启动电脑就能看到效果,在虚拟机里面也行,具体怎么弄你可以参考于渊的著作《自己动手写操作系统》)
然后启动电脑就行了

对于问题1,和问题5
你想深入研究建议你去找一本介绍早期linux内核源代码的书籍来看一下
汇编程序在没有操作系统的情况下运行 相当于你在写操作系统,几乎没有功能的操作系统,你只能调用BIOS中断!

在没有操作系统的情况运行 程序->你自己想象开发操作系统的过程吧!怎么运行我已经告诉你了!不会的话你找我要工具
我可以给你 nasm编译器,磁盘烧写工具!如果你需要我可以直接把二进制文件给你!
匿名用户
2013-12-14
展开全部
百度有介绍
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2013-12-14
展开全部
C语言是基础啊什么FPA
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式