佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

查看: 5200|回复: 66

【常见问题】x86组合语言Assembly Language连接索引

[复制链接]
发表于 5-5-2005 11:51 PM | 显示全部楼层 |阅读模式
机械语言 (Machine Language)
从软件的角度来看,最接近硬体的电脑语言是机械语言,目前处理机所执行的都是机械语言。无论你用C, C++, Pascal或.NET,这些语言最终都会被编译到机械指令。每个处理机(processor)都有自己的机械语言指令组(instruction set)。

组合语言 (Assembly Language)
机械语言都是数字。譬如说我们要写以下程式:

  1. a = 1
  2. b = 2
  3. a = a + b
  4. 以x86组合语言来编写,我们可以这样写:
  5. [code]
  6. mov ax, 1
  7. mov bx, 2
  8. add ax, bx
复制代码

将以上组合语言换成16进制的机械语言,就变成这样:

  1. B80100  <-- 这就是 mov ax, 1
  2. BB0200  <-- 这就是 mov bx, 2
  3. 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 编辑 ]
回复

使用道具 举报


ADVERTISEMENT

 楼主| 发表于 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。

  1. main() {
  2.   _asm {
  3.     mov ax, 3
  4.     int 10h
  5.   }
  6. }
复制代码

compile成exe了之后,在Clipper内Run TextMode.exe就行了。
回复

使用道具 举报

Follow Us
发表于 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里这样输入:

  1. [d:\]debug
  2. -a
  3. 0B45:0100 mov ax,7
  4. 0B45:0103 int 10
  5. 0B45:0105 int 20
  6. 0B45:0107
  7. -rcx
  8. CX 0000
  9. :7
  10. -nTextMode.com
  11. -w
  12. Writing 00007 bytes
  13. -q

  14. [d:\]
复制代码

这样就会产生一个叫TextMode.com的文件。


全球最小的GUI OS。
竟然是用ASM来写的。
他可以小得可以放在在一张磁碟片里。

你指 MenuetOS?
http://www.menuetos.org
回复

使用道具 举报


ADVERTISEMENT

发表于 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 | 显示全部楼层
原帖由 fxam 于 20-8-2005 03:40 AM 发表


你指 MenuetOS?
http://www.menuetos.org




是的是的。
就是这个。
我试过蛮不错。

不过因为是在磁碟。
所以运作得比较慢。

用这个内建的工具来写程式蛮不错。
回复

使用道具 举报

发表于 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 | 显示全部楼层
不好乱乱玩归零哦.....
一个不好就把HD给玩瓜了.......因为我试过...
回复

使用道具 举报


ADVERTISEMENT

发表于 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吧?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2023 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 29-3-2024 09:55 PM , Processed in 0.069023 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表