初学者对于汇编的好奇

dflzj1023 2016-05-18 11:48:47
其实我一直都听闻汇编很强大,但是却一直不知道,汇编到底能用来干什么,它所强悍的涉及领域又在哪里,它与其他语言有多大关联?求大神们指导一下。因为一直想学,但是又不知道到底该不该学,谢谢。
...全文
2336 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq282100640 2016-11-01
  • 打赏
  • 举报
回复
我来讲点不着边的吧, 做为一个普通驾驶员,会开车,开好车就行了,,,,,,,,至于你轮胎的橡胶配方,,,,一辈子也不用了解, 但做为一个就爱刨根问底的赛车手,,,,你要懂化学,,,要去了解橡胶配方,,,在XXX转的情况下,你的轮胎能挺几秒,,如果喷氮气,用量是多少,,, 当时学汇编,,我只是想学CPU的运行,,学软件是没有根的,,,学汇编你可以望到遥远的硬件端,,可以找到根
Happy0403 2016-10-21
  • 打赏
  • 举报
回复
最后,说一件令人悲伤的事情。 我一个同学,没学过汇编,C/C++也几乎不懂。从上Java课之后才开始认真学习的。 他现在写项目,特别是那种类似QQ的,1天顶我3天的工作量。虽然我懒是事实,但是汇编在现代化的快速开发中是派不上什么用场的。 这个例子是为了说明,汇编作为底层语言,在快速开发中派不上用场。想要跟上现代的编程脚步、快速开发,学汇编就是在浪费生命。 有得必有失,学习汇编对现代化的快速开发没有帮助。这就像学英语单词一样,突然间背几个英语单词没什么用。但是一直坚持背上半年,你同龄人的英语水平在你眼中就像文盲一样了。所以如果你是大学生甚至更年轻,有充足的时间安逸地学习,我建议你学。
Happy0403 2016-10-21
  • 打赏
  • 举报
回复
这个问题我来回答吧。 我已经非常系统地学习了x86汇编,对x64以及其他指令集的汇编都有接触以及使用。目前仍在学习汇编。 本来我是想直接说汇编怎样怎样的,但是想了想,对一个新手来说这可能太抽象。就像对还在考虑买哪一架自行车比较划算的中学生说一堆跑车品牌一样,没有任何的实际作用。 先说说我是在什么情况下学习的汇编吧。 ---------------------------------------------------------------------------------------------- 我一开始接触的就是汇编,一开始什么都不懂,就只是猜出了mov应该是赋值的意思,jmp应该是跳的意思,eax,ebx等等应该是一些容器,其他都不懂。 在这种情况下,我接触了C语言。学了一点儿C语言的同学都喜欢说,掌握了指针,就算是掌握了C语言,因为他们认为指针是C语言中最难懂、最抽象的部分。我在学习的时候正好相反。当我看书快看到指针一章的时候,我就觉得,C语言还少了点什么。看到指针的时候,我豁然开朗:就是需要有这种东西嘛! 因为我学了一点点汇编,了解了内存以及CPU的大概的工作方式,所以我学C语言的时候得心应手。同样的,在学习C++的各种特性,例如“继承”,“引用”的时候,也遇到了类似的情况。 总的来说就是,学习汇编,你就会知道CPU到底是如何工作的。你就会知道哪些事情电脑做得到,哪些事情做不到。你也会自然而然地知道,为什么这个编程语言要我们把代码写成这样子,而不是那样子。 --------------------------------------------------------------------------------------------- 后来,我开始写我的第一个“项目”。能自己写项目的学过C/C++的同学,应该都会写过同样的程序,那就是:木马或者病毒程序! 我的第一个项目就是一个木马程序。其中用到了不少技术都不属于常规开发技术。仅仅使用C++是无法实现的(当然,有其他可以使用C++实现的技术代替,但是效果终究是不一样的)。还好,我会汇编,只要会汇编,就没有什么技术是无法实现的。 这个例子是为了说明,掌握汇编会让你没有技术死角,完成更多别人做不到的事情。 --------------------------------------------------------------------------------------------- 前段时间,我迷上了一款手游~啊,那款手游真好玩,就是太花钱了。根据我的开发经验看,这种类型的游戏必定存在XXX的漏洞。于是我打算对这款手游进行破解。呵呵呵呵,接下来的工作,全程汇编。 现在,我在做一款手游。啊,我又想起了前段时间被我破解的那款手游~~如果不做点防护的话,肯定会有很坏很坏的人来破解我的游戏,这可不行!还好我懂汇编,不然我的游戏要被坏蛋捅成筛子。 这个例子是为了说明,某些特定领域,例如软件安全领域,必须掌握汇编。
Symfund 2016-10-16
  • 打赏
  • 举报
回复
引用 14 楼 wu_chung_tang 的回复:
給初學者一點個人的意見:IT行業很快就沒有好奇感,畢竟原理就那麼點。相比於science比如物理,那是無窮無盡的好奇的東西等待人類探索。IT已經是純商業的東西,不是科學 當然人各有志,若只對錢感興趣,那沒錯
数学才是王道,物理都要靠边站,不要把现在流行的“人工智能”,“虚拟现实”蒙住了双眼,没有数学思想上的解放,这些学科只是玩具,只是皮毛而已。
Enter空格 2016-10-13
  • 打赏
  • 举报
回复
这么说吧,汇编语言可以帮助你轻松理解c++,c++又帮助你轻松理解一切高级语言。
Enter空格 2016-10-13
  • 打赏
  • 举报
回复
对我来讲,汇编语言最大的作用,是帮助理解c\c++这种原生编译语言。 特别是c++,那些书本上很多冗长拗口抽象的特性叙述,使用VS进行一次反汇编,比什么都清楚了。 把学习C++的各种抽象特性,变为直观具体的东东。 学习汇编,你会知道机器是如何执行的。
zenny_chen 2016-10-02
  • 打赏
  • 举报
回复
引用 8 楼 mydo 的回复:
[quote=引用 7 楼 lshhjxlj 的回复:] 汇编是必须要掌握的
错!汇编是最不需要掌握的[/quote] 呵呵,你们就别再争了,你们谁有本事在iPhone 6上把512x512的单精度浮点矩阵乘法计算时间控制在18ms以内,谁就是王者!不管你是用Swift还是用汇编~
大熊猫侯佩 2016-09-29
  • 打赏
  • 举报
回复
引用 15楼lshhjxlj 的回复:
[quote=引用 8 楼 mydo 的回复:] [quote=引用 7 楼 lshhjxlj 的回复:] 汇编是必须要掌握的
错!汇编是最不需要掌握的[/quote] 一派胡言[/quote]你确定!?对于一个iOS或安卓的开发者来说,汇编是最需要掌握的!?
lshhjxlj 2016-09-29
  • 打赏
  • 举报
回复
引用 8 楼 mydo 的回复:
[quote=引用 7 楼 lshhjxlj 的回复:] 汇编是必须要掌握的
错!汇编是最不需要掌握的[/quote] 一派胡言
wu_chung_tang 2016-09-20
  • 打赏
  • 举报
回复
給初學者一點個人的意見:IT行業很快就沒有好奇感,畢竟原理就那麼點。相比於science比如物理,那是無窮無盡的好奇的東西等待人類探索。IT已經是純商業的東西,不是科學 當然人各有志,若只對錢感興趣,那沒錯
ensky. 2016-09-01
  • 打赏
  • 举报
回复
在一些低功耗的小芯片上,汇编代码运行效率极高,只要写的还可以,代码冗余会比C少很多。而且针对芯片级的编码,C编译器得看做的好不好,如果做的不好,会出现编译出来的汇编上错误的。 对于现在炒的很火的物联网,如果真的实现处处可以连通,处处可以感知,那一定少不了那些微型芯片,比如ARM最低端的Cortex M0这样的。在这样的芯片上,资源紧张的情况下,汇编会是最优选择。
fly 100% 2016-08-23
  • 打赏
  • 举报
回复
现在编译器这么牛逼 汇编用处也不大了
赵4老师 2016-08-22
  • 打赏
  • 举报
回复
再比如用来干这个:
/*
    Application:    Code Injection in Explorer
    Author:     @_RT
    Compiled on:    Feb 2014
    URL:http://www.codeproject.com/Tips/732044/Code-Injection-2

    We will see the different steps involved to perform a code injection into an already running process.

    Following are the quick steps through the process of injection.
    1.Get the API addresses that you will be calling from the injected code.
    2.Prepare shell code of your function that you want to get executed from the injected process.
    3.Get the process ID of the running process that you wish to inject into by enumerating through the
      list of processes or by finding the process's window (in case it's a GUI application) by class name or title.
    4.Open the process using its Pid with All Access rights.
    5.Allocate different memory spaces in the process that you are going to inject to with desired access
      rights for holding different segments of your shell code.
        Code part (executable instructions)
        Data part (strings, function parameters, etc.)
    6.Write the allocated memories with the respective values (code and data).
    7.Call CreateRemoteThread API and pass to it the start of allocated memory address where you have
      written your shell code from the process we are injecting.
*/

#include <windows.h>
#pragma comment(lib,"user32.lib")

LPVOID addr;
LPVOID addr2;

BOOL InjectExecutable(DWORD dwPid,LPVOID si,LPVOID pi,int sisize,int pisize)
{
    LPVOID hNewModule;
    HANDLE hProcess;
    CHAR S[]    = { "C:\\Windows\\system32\\notepad.exe" };
    BYTE byt[]  = {0x6A, 0x00, 0x6A, 0x00, 0x6A, 0x00, 0x6A, 0x01, 0x6A, 0x00, 0x6A, 0x00, 0x6A, 0x00, 0x68};
                 //push  0   , push     0, push     0, push     1, push     0, push     0, push     0, push 0xXXXXXXXX
    BYTE byt2[] = {0xE8};//call 0xXXXXXXXX
    BYTE byt3[] = {0x68};//push 0xXXXXXXXX

    hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPid);
    if (hProcess == NULL)
    {
        return FALSE;
    }

    LPVOID staddr = VirtualAllocEx(hProcess, NULL, sizeof(S), MEM_COMMIT, PAGE_READWRITE);
    WriteProcessMemory(hProcess, staddr, S, sizeof(S), NULL);
    LPVOID fnaddr = VirtualAllocEx(hProcess, NULL, 4, MEM_COMMIT, PAGE_READWRITE);
    WriteProcessMemory(hProcess, fnaddr, pi, sisize, NULL);
    LPVOID fnaddr2 = VirtualAllocEx(hProcess, NULL, 4, MEM_COMMIT, PAGE_READWRITE);
    WriteProcessMemory(hProcess, fnaddr2, si, pisize, NULL);

    hNewModule = VirtualAllocEx(hProcess, NULL, 100, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    if (hNewModule == NULL)
    {
        return FALSE;
    }
    LPTHREAD_START_ROUTINE strtaddr = (LPTHREAD_START_ROUTINE)hNewModule;

    WriteProcessMemory(hProcess, hNewModule, byt3, sizeof(byt3), NULL);
    hNewModule = (LPVOID)((int)hNewModule + sizeof(byt3));
    WriteProcessMemory(hProcess, hNewModule, &fnaddr, sizeof(fnaddr), NULL);
    hNewModule = (LPVOID)((int)hNewModule + sizeof(fnaddr));                    // push &pi ;lpProcessInformation
    WriteProcessMemory(hProcess, hNewModule, byt3, sizeof(byt3), NULL);
    hNewModule = (LPVOID)((int)hNewModule + sizeof(byt3));
    WriteProcessMemory(hProcess, hNewModule, &fnaddr2, sizeof(fnaddr2), NULL);
    hNewModule = (LPVOID)((int)hNewModule + sizeof(fnaddr2));                   // push &si ;lpStartupInfo
    WriteProcessMemory(hProcess, hNewModule, byt, sizeof(byt), NULL);           // push 0 , push 0, push 0, push 1, push 0, push 0, push 0, push 0xXXXXXXXX==&S[0];"C:\\Windows\\system32\\notepad.exe"
    hNewModule = (LPVOID)((int)hNewModule + sizeof(byt));                       // lpCurrentDirectory,lpEnvironment,dwCreationFlags,bInheritHandles,lpThreadAttributes,lpProcessAttributes,lpCommandLine,lpApplicationName
    WriteProcessMemory(hProcess, hNewModule, &staddr, sizeof(staddr), NULL);
    hNewModule = (LPVOID)((int)hNewModule + sizeof(staddr));
    WriteProcessMemory(hProcess, hNewModule, byt2, sizeof(byt2), NULL);
    hNewModule = (LPVOID)((int)hNewModule + sizeof(byt2));                      // call CreateProcessA
    addr = (LPVOID)((int)addr - ((int)hNewModule + 4));
    WriteProcessMemory(hProcess, hNewModule, &addr, sizeof(addr), NULL);
    hNewModule = (LPVOID)((int)hNewModule + sizeof(addr));
    WriteProcessMemory(hProcess, hNewModule, byt, 2, NULL);
    hNewModule = (LPVOID)((int)hNewModule + 2);                                 // push 0 ;DWORD dwExitCode   // exit code for this thread
    WriteProcessMemory(hProcess, hNewModule, byt2, sizeof(byt2), NULL);
    hNewModule = (LPVOID)((int)hNewModule + sizeof(byt2));                      // call ExitThread
    addr2 = (LPVOID)((int)addr2 - ((int)hNewModule + 4));
    WriteProcessMemory(hProcess, hNewModule, &addr2, sizeof(addr2), NULL);

    CreateRemoteThread(hProcess, 0, 0, strtaddr, NULL, 0, NULL);
    return TRUE;
}

int main()
{
    _STARTUPINFOA si;
    PROCESS_INFORMATION pi;

    ZeroMemory(&si, sizeof(si));
    si.cb = sizeof(si);
    ZeroMemory(&pi, sizeof(pi));

    DWORD dwPid;
    HMODULE ldlib = LoadLibraryA("Kernel32.dll");
    addr = GetProcAddress(ldlib, "CreateProcessA");
    addr2 = GetProcAddress(ldlib, "ExitThread");
    HWND hWnd1=FindWindow(NULL, "Program Manager");
    if (NULL==hWnd1) {
        return 1;
    }
    GetWindowThreadProcessId(hWnd1, &dwPid);

    InjectExecutable(dwPid,&si,&pi,sizeof(si),sizeof(pi));

    return 0;
}
赵4老师 2016-08-22
  • 打赏
  • 举报
回复
比如用来干这个:
#include <stdio.h>
float data[500];
int i;
void main() {
    for (i=0;i<500;i++) {data[i]=1.0f;printf("%g\n",data[i]);}
    __asm {
        push ecx
        push edi
        mov ecx,500
        mov eax,0xBF800000 //-1.0f
        lea edi,data
        rep stosd
        pop edi
        pop ecx
    }
    for (i=0;i<500;i++) printf("%g\n",data[i]);
}
赵4老师 2016-08-22
  • 打赏
  • 举报
回复
《The Intel 64 and IA-32 Architectures Software Developer's Manual》 面向对象只是一种编程思想。 再抽象的编程语言,最后不都变成汇编代码了吗?我们完全可以说汇编语言是面向对象、脚本化、动态化、泛函化、并行化、分布化的语言。
大熊猫侯佩 2016-05-28
  • 打赏
  • 举报
回复
引用 7 楼 lshhjxlj 的回复:
汇编是必须要掌握的
错!汇编是最不需要掌握的
用户 昵称 2016-05-23
  • 打赏
  • 举报
回复
引用 5 楼 mydo 的回复:
我是如何从汇编脑残粉转变的...
lshhjxlj 2016-05-23
  • 打赏
  • 举报
回复
汇编是必须要掌握的
kleasting 2016-05-21
  • 打赏
  • 举报
回复
汇编语言是提高你理解计算机软件基本工作原理的素养,汇编语言在系统级的底层软件占据重要作用: 1. 操作系统的引导启动。例如经典的x86体系结构,需要用汇编语言编写实模式的操作系统引导代码,将磁盘中的操作系统内核加载到内存指定区域中,操作系统才可以运行。 2. 编译器的前端。比如C编译器,会将你编写好的C语言代码先经过编译成汇编代码,再由汇编器生成本机机器码。 3. 操作系统中的部分硬件驱动程序。 4. 嵌入式开发中多用C语言加一点汇编来开发进行单片机程序开发。 学好汇编,你可以深入理解高级语言的运行机制,在你未来从事软件开发时,你会为此获益良多
加载更多回复(3)

21,459

社区成员

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

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