查看: 5396|回复: 66
|
【常见问题】x86组合语言Assembly Language连接索引
[复制链接]
|
|
机械语言 (Machine Language)
从软件的角度来看,最接近硬体的电脑语言是机械语言,目前处理机所执行的都是机械语言。无论你用C, C++, Pascal或.NET,这些语言最终都会被编译到机械指令。每个处理机(processor)都有自己的机械语言指令组(instruction set)。
组合语言 (Assembly Language)
机械语言都是数字。譬如说我们要写以下程式:
- a = 1
- b = 2
- a = a + b
- 以x86组合语言来编写,我们可以这样写:
- [code]
- mov ax, 1
- mov bx, 2
- add ax, bx
复制代码
将以上组合语言换成16进制的机械语言,就变成这样:
- B80100 <-- 这就是 mov ax, 1
- BB0200 <-- 这就是 mov bx, 2
- 01D8 <-- 这就是 add ax, bx
复制代码
看到机械语言的麻烦了吧?这就是为什么我们需要组合语言。
从上面的例子来看,我们可以这么说:以“组合语言”编程,就等于在“机械语言”的层面上动刀。通常,我http://www.buku.com.my/们使用编辑器(Editor)编写组合语言程式,然后使用“组合语言编译器(Assembler)”,将源码编译成机械语言。
x86
x86指的是Intel 8086, 80186, 80286, 80386, 80486和Pentium系列。x86组合语言就是指这些处理机的组合语言。x86的指令是向上兼容的,意思是说,80286和80386的指令,也可以在Pentium上执行。
为什么要用组合语言?
机械语言麻烦,但组合语言也不见得方便。那为什么这种时代还要学习组合语言呢?
-虽然目前的处理机速度极快,但为求最高速度和最小空间,有时候仍得使用组合语言编程。例如游戏中的重要部份、硬件驱动器(driver)、科学运算等。
-好奇心作祟,想了解电脑软件最低层的运作
-反编译软件,了解及破解软件
-单片机(microcontroller)的记忆空间通常很小,仍需使用组合语言编程。
虽然组合语言可以达到速度和空间的极点,但是如果你对于组合语言一知半解,写出来的程式仍可能比高级语言编出来的慢。
教程
朱邦复工作室的连结 - http://www.cbflabs.com/tec/asm/asmlink.htm
教程(英文)
Art of Assembly Language - http://webster.cs.ucr.edu
Iczelion's Win32 - http://win32assembly.online.fr
其它教程
C-- http://cmm.e104.org/ http://tim.e104.org/?TIM=FORUM&FORUM=59
编译器 Assembler
MASM (Microsoft Macro Assembler) (DOS, Windows)
TASM (Borland Turbo Assembler) (DOS, Windows) - http://info.borland.com/borlandcpp/cppcomp/tasmfact.html
NASM (DOS, Linux, Windows) - http://nasm.sourceforge.net
FASM (DOS, Linux, Windows) - http://flatassembler.net
GoASM - http://www.godevtool.com
HLA - http://webster.cs.ucr.edu/AsmTools/HLA/dnld.html
编辑器 Editor
RadASM - http://radasm.visualassembler.com
Easy Code - http://easycoder.org/English
WinAsm Studio - http://www.winasm.net
Fresh - http://fresh.flatassembler.net
AsmEdit - http://asmedit.massmind.org
C--IDE - http://qs-ong.port5.com/ http://forums.c--sphinx.net
可以直接加入组合语言的电脑语言
C
C++
Pascal
Delphi
Sphinx C--
可以看到源码变成什么组合语言的编辑环境
Microsoft Visual Studio - www.microsoft.com/vstudio
Borland Delphi - www.borland.com/delphi
Borland C++ Builder - www.borland.com/cbuilder
Sphinx C--
反编译器 Disassembler
IDA (Linux+Windows) - www.datarescue.com 也可反编译其它处理器如Intel, Zilog, Motorola, GameBoy等
侦错器 Debugger (Windows)
SoftICE - www.compuware.com
IDA - www.datarescue.com
Ollydbg - http://home.t-online.de/home/Ollydbg
下载
MASM32 (含MASM及工具的Win32编程配套)- http://www.masm32.com
论坛
Win32Asm Community - http://win.asmcommunity.net/board/
MASM - http://www.masmforum.com
Flat Assembler - http://board.flatassembler.net
Sphinx C-- http://forums.c--sphinx.net
参考资料
Intel Pentium 4 资料(含处理器指令) - http://intel.com/design/Pentium4/documentation.htm
Intel 其它资料 http://www.intel.com/cd/ids/developer/asmo-na/eng/reference/index.htm
AMD - http://developer.amd.com/
[ 本帖最后由 fxam 于 18-2-2006 10:24 PM 编辑 ] |
|
|
|
|
|
|
|
楼主 |
发表于 5-5-2005 11:59 PM
|
显示全部楼层
在C/C++里加入组合语言指令
int foo()
{
int i;
asm {
mov eax, 5
add i, eax
}
return i;
}
以上只是例子,真正情况请参考你的语言手册,确认需要保存的暂存器(register)。
[ Last edited by fxam on 6-5-2005 at 12:06 AM ] |
|
|
|
|
|
|
|
楼主 |
发表于 5-5-2005 11:59 PM
|
显示全部楼层
利用Visual C++学习组合语言
-找一個類似"嗨,塵世"的簡單Win32源碼。
如果想更簡單,就在WinMain裡叫個MessageBox就行了。
-在Visual Studio裡開啓。
接下來有兩個選擇:
1. 如果想知道WinMain之前發生的事情:
-選Debug, Step Into。編譯過後,VS可能會說:“沒有源碼,是否要顯示組合語言?”
答“是”。組合語言會從wWinMainCRTStartup開始,接下來慢慢Step Into或Step Over。會慢慢達到WinMain。如果你的VS是安裝完整的,你將會在這裏看到wWinMainCRTStartup的C++源碼以及它被編譯後的組合語言指令。
2. 如果只想從WinMain開始了解:
-在WinMain放BreakPoint,然後選Debug, Start。
-VS停在WinMain時,選Debug, Windows, Disassembly。
看久了,就會知道這些源碼會變成怎樣的組合語言。
你也會發現,其實並不難,只是很麻煩而已。
對於沒有源碼的東西,建議用IDA Pro (http://www.datarescue.com/idabase),一流的反編譯器和偵錯器。Ollydbg也很棒 (http://home.t-online.de/home/Ollydbg/) |
|
|
|
|
|
|
|
发表于 6-5-2005 12:31 AM
|
显示全部楼层
谢谢分享
FASM和NASM有什么分别?
用那个比较好?
教程有中文的最好
本人英文不好
如果想写ASM code
要看window assembly还是linux assembly? |
|
|
|
|
|
|
|
楼主 |
发表于 6-5-2005 11:36 PM
|
显示全部楼层
> FASM和NASM有什么分别?
没用过。
> 用那个比较好?
最好先用MASM,因为较多资料。
> 教程有中文的最好
上面已加一个
> 本人英文不好
那顺便学英文
> 要看window assembly还是linux assembly?
习惯那里就在那里先下手,反正指令是一样的。 |
|
|
|
|
|
|
|
发表于 19-8-2005 08:26 AM
|
显示全部楼层
由于Clipper写的程序在XP下跑Full Screen的时候会用80x43以至走位。
我很常用由Ms-C 6.0写的组合语言,用来设成Text Mode。
- main() {
- _asm {
- mov ax, 3
- int 10h
- }
- }
复制代码
compile成exe了之后,在Clipper内Run TextMode.exe就行了。 |
|
|
|
|
|
|
|
发表于 19-8-2005 09:52 AM
|
显示全部楼层
其实我很喜欢ASM。
有学过一些日子。
都是自己摸索。
不知道你们是否知道呢?
全球最小的GUI OS。
竟然是用ASM来写的。
他可以小得可以放在在一张磁碟片里。 |
|
|
|
|
|
|
|
楼主 |
发表于 20-8-2005 03:40 AM
|
显示全部楼层
main() {
_asm {
mov ax, 3
int 10h
}
}
另一个法子是用debug.exe来做一个7 byte的COM文件 (还有人记得吗?),步骤如下:
-按Start, Run, 输入cmd.exe。98/ME系统则输入command
-在那黑漆漆的窗口里,输入debug,按Enter。(XP下的debug.exe在system32里)
-在debug里这样输入:
- [d:\]debug
- -a
- 0B45:0100 mov ax,7
- 0B45:0103 int 10
- 0B45:0105 int 20
- 0B45:0107
- -rcx
- CX 0000
- :7
- -nTextMode.com
- -w
- Writing 00007 bytes
- -q
- [d:\]
复制代码
这样就会产生一个叫TextMode.com的文件。
全球最小的GUI OS。
竟然是用ASM来写的。
他可以小得可以放在在一张磁碟片里。
你指 MenuetOS?
http://www.menuetos.org |
|
|
|
|
|
|
|
发表于 20-8-2005 08:43 AM
|
显示全部楼层
终于看到有人对low level 的编程有兴趣 。
个人喜欢用masm, 有兴趣的人可以参考 ASSEMBLY LANGUAGE FOR INTEL-BASE COMPUTER,是一本很不错的书。里面也有附送一片MASM 6.11的软件。 |
|
|
|
|
|
|
|
发表于 20-8-2005 08:50 AM
|
显示全部楼层
我不大会用 debug,我前辈给我上过一节课,怎样 restart 电脑,都忘了,只记得他讲重点是“归零”。
我死党则用它来低层次格式化硬盘 = lovel level format harddisk。 |
|
|
|
|
|
|
|
发表于 22-8-2005 12:06 AM
|
显示全部楼层
是的是的。
就是这个。
我试过蛮不错。
不过因为是在磁碟。
所以运作得比较慢。
用这个内建的工具来写程式蛮不错。 |
|
|
|
|
|
|
|
发表于 22-8-2005 12:08 AM
|
显示全部楼层
原帖由 白日梦 于 20-8-2005 08:50 AM 发表
我不大会用 debug,我前辈给我上过一节课,怎样 restart 电脑,都忘了,只记得他讲重点是“归零”。
我死党则用它来低层次格式化硬盘 = lovel level format harddisk。
哦,我会一点点的Debug程式。
还有忘了怎样写程式了。
虽然很喜欢这个程式。 |
|
|
|
|
|
|
|
发表于 22-8-2005 12:49 AM
|
显示全部楼层
原帖由 白日梦 于 20-8-2005 08:50 AM 发表
我不大会用 debug,我前辈给我上过一节课,怎样 restart 电脑,都忘了,只记得他讲重点是“归零”。
我死党则用它来低层次格式化硬盘 = lovel level format harddisk。
归零? 是不是 cs = f000 ip = fff0 ? |
|
|
|
|
|
|
|
发表于 22-8-2005 01:13 AM
|
显示全部楼层
jmp f000:fff0 应该可以在 dos mode reboot,
要注意的是很多 assembly 的 example 都是 direct control hardware 的,
在 windows 环境之下会 exception error.
而在 dos 环境也可能会 system halt
一般上,学 assembly 需要对硬体有一定的了解,
在不同的 cpu,assembly 的指令及一些技巧也有些不同。
当然一般上大家都是指 x86 的 assembly. |
|
|
|
|
|
|
|
发表于 22-8-2005 08:30 AM
|
显示全部楼层
原帖由 糯米鸡 于 22-8-2005 12:49 AM 发表
归零? 是不是 cs = f000 ip = fff0 ?
不知道,忘记了。
我家里是有一本廿年的组合语言的编程书,不过我没用过 MASM 来写,我用的是据Ms-C6.0教程书籍的示范来编。 |
|
|
|
|
|
|
|
发表于 22-8-2005 08:59 AM
|
显示全部楼层
|
|
|
|
|
|
|
发表于 22-8-2005 11:48 AM
|
显示全部楼层
jmp f000:fff0还不至于会玩坏HDD...除非...还是别说了... |
|
|
|
|
|
|
|
发表于 22-8-2005 03:02 PM
|
显示全部楼层
是...CXXX:XXXX????好久没玩了... |
|
|
|
|
|
|
|
发表于 22-8-2005 04:07 PM
|
显示全部楼层
原帖由 AquaMax 于 22-8-2005 03:02 PM 发表
是...CXXX:XXXX????好久没玩了...
oh~ 你是指segmentC800之前?那就可能了... |
|
|
|
|
|
|
|
发表于 22-8-2005 04:19 PM
|
显示全部楼层
BB0200 <-- 这就是 mov bx, 1
刚刚才注意到... mov bx,1 的机器码应该是BB0100吧? |
|
|
|
|
|
|
| |
本周最热论坛帖子
|