精华内容
下载资源
问答
  • 七天学完汇编语言之第一天

    千次阅读 2018-10-15 23:41:49
    七天学完北大离散数学课程:第一天1. 计划概览2. 今日学习成果3. 今日时间表3. 今日反思3. 明日学习目标5. 相关资料5.1. 起床打卡图片5.2. 今日时间统计5.3. 每日学习总结视频-B站链接5.4. 每日思维导图内容截图5.5 ...

    1. 本周计划概览

    本计划是 2年修完清华6个CS硕士学位的第3次周计划(第26天~33天)
    计划内容如下
    a)2天学完计算机原理,平均每天10小时(总计20小时,其中视频时长10小时)(仅仅掌握课程框架内的知识 这是很浅的课程)
    b)5天学完汇编语言,平均每天14小时(总计70小时,视频时长20小时) (深度掌握,理解课程框架内的一切本质和核心)
    c)计划时间: 10.15~10.22号 7天高效学习90小时

    课程地址:http://www.jikebiancheng.com/
    使用教材:《汇编语言(王爽)》和《x86汇编语言:从实模式到保护模式(李忠)》
    

    2. 今日学习成果

    今日评分: 87分(优秀,但有待提高)

    .
    学习成果:
    .在这里插入图片描述
    .
    .

    3. 今日时间表

    在这里插入图片描述

    3. 今日反思

    1. 重感冒3天,今天算是好了。因此从明天开始睡眠时间要控制在5小时之内了!
    2. 今日低效率时间在1小时左右,有待提高
    3. 今日核心知识学习时间10.5小时,有待提高(明日突破14小时)
    4. 本周我将首次在学习过程引入“刻意复习”(我将在合适的时机完整的阐述该方法)的学习方法,该方法将使得我7天后学完本周课程的同时对本课程(汇编语言)的大部分知识点有极其深刻的印象。(通俗的说:通过一周的刻意复习,学完这一周汇编语言后,我一个月不用复习仍然能够记得其中80%内容)

    3. 明日目标

    1. 完成计算机原理学习
    2. 开始汇编语言学习
    3. 核心学习时间不少于14小时
    4. 刻意复习时间不少于1.5小时
    5. 预告:我会在15天之内做好准备,15天之后 我将公开我每天所有的学习录屏视频。
    展开全文
  • 汇编语言学习总结一

    2019-10-10 18:11:24
    一、什么汇编语言? 其本质是机器语言的符号化。那什么是机器语言? 机器语言是机器指令的集合,是由0和1构成的二进制代码。 那什么是机器指令?机器指令是计算机CPU执行某种操作的命令编码。指令系统是指某一类型...

    一、什么是汇编语言?

    其本质是机器语言的符号化。那什么是机器语言?
    机器语言是机器指令的集合,是由0和1构成的二进制代码。
    那什么是机器指令?机器指令是计算机CPU执行某种操作的命令编码。指令系统是指某一类型CPU中所有机器指令的集合。8086/8088CPU的指令系统共包含92种基本指令,按照功能可将它们分为6大类:数据传送指令、算术运算指令、逻辑运算和移位指令、串操作指令、控制转移指令、处理器控制指令。
    嗯,,,,百度的概念,记不住。等哪天学到返璞归真了再来解释

    二、 谁还在用它?可以用在哪些方面?

    #我当然想知道这个有没有用,老师劈里啪啦说了一大堆,但并没有觉得它很有用。似乎程序员的社区里关心这个的比较少,还是说我没有找到?#
    参考了以下网友的回答:
    #在嵌入式、安全等领域相对校多,它可能是解决某个问题的关键点。
    #学完X86汇编后还应该学以下ARM汇编,还有PPC汇编,MIPS汇编。没见过,估计是一通百通的。

    三、 汇编难不难?

    借用知乎一个前辈的回答
    汇编语言本身很简单,常用指令没几个,语法规则也不多,看几个小时资料似乎就明白了,但其实不然。汇编的背后是体系结构,是程序设计抛开各种高层形态的最根本,最本质的解释。
    #想掌握汇编,还是要多实践。
    1 早年用汇编手写病毒。比如处理指令重定位,是真的用汇编计算指令地址,push push call 实现函数调用。

    2 长期病毒木马2进制分析。分析明白各种 malware 的原理,实现查杀防。个别病毒,需要实现修复。

    3 漏洞挖掘。fuzzer 发现漏洞,汇编级详细分析,exploit 编写,武器化利用,一条龙。

    4 各种逆向分析。好的东西没有代码,IDA 里看就是了。

    5 跟debuger 做朋友。从来看不上print 方式的bug定位。所有问题在调试器里分析明白,绝不靠猜。

    6 编译器后端研究。什么指令选择,指令调度,寄存器分配,全都研究一遍。

    7 底层开发,操作系统,设备驱动,虚拟化都走上一遍。X86很熟? ARM学一遍做对比。

    四、额外的基础知识(期末考点)

    #1、进位计数制及数制的转换。简单点说,要能够在二进制、十进制、八进制、十六进制中熟练的相互转换。
    在这里插入图片描述#这几个都是逢N进一。
    在这里插入图片描述二进制之间作加减乘除,不要熟练,至少要会。在汇编语言程序中,数据通常采用十六进制,十六进制的数制要熟练掌握。
    #非十进制的数转换为十进制的数通常是按权展开。
    而十进制的数转换为非十进制的数通常除K取余。要熟练,不能一知半解。
    #如果是十进制的小数,如0.6875这种转换为非十进制的,采用“乘基取整法”。将十进制的小数乘以非十进制的基,记下产生的小数部分再乘,取出每次相乘得到的整数。直至积的小数部分为0为止。
    #有符号数:最高位表示符号(正或负)其余位表示数的大小。
    #它又称为机器数,机器数可以采用原码、反码、补码表示。
    这好像又TM是个考点。
    在这里插入图片描述原码的最高位表示真值的数符,其余位为数值位,且与真值的数值位相同,必要时在数值位前加上前0。
    数的原码表示具有直观、与真值的转换方法简单等优点,但是原码有着算术运算复杂的缺陷。与手算相同,做加法运算时,首先要判断两数的数符,同号则相加,异号则相减。做减法运算时,还必须比较两数的绝对值,用较大的绝对值减去较小的绝对值,差的数符则采用绝对值较大者的数符。以上的算法对于硬件实现来说比较困难。
    3.补码
    补码的引入,是为了简化减法运算。补码的概念在日常生活中经常用到,例如手表的校时。假定手表停在11时,而标准时间为9时,可以使用两种校时方法:一种方法是逆时针调2小时,即11-2=9;另一种方法是顺时针调10小时,在调至12时后则为0时,即到12时时归零,因此有11+10=9(称为模加)。于是,就手表校时而言有:
    在这里插入图片描述这里12称为模,10称为2的补数。由此看出,减去一个数等价于加上该数的补数。下面介绍计算机中使用的补码的含义、求取方法及其运算。
    (1)补码定义

    在这里插入图片描述当一个数为正数,则其补码就是该数本身;为负数,则其补码等于模值与该数绝对值之差。式中的n为补码的位数。
    (2)根据真值求补码
    根据补码定义可以求取一个数的补码,然而还可以采用更为简便的方法。求取一个数的n位补码的简便方法是:对于正数,通过补前0,将其数值部分补至n位即可;对于负数通过补前0,将其数值部分补至n位,然后按位取反并在末位加1即可。
    【例1.15】求出以下各数的8位补码:
    +1000011B,-111000B,+1111111B,-10000000B,0
    ① 将+1000011B的数值部分通过补前0达到8位,即可得到其补码:

          [+1000011B]补=01000011B
    

    ② 将-111000B的数值部分通过补前0达到8位,即00111000B。

          按位取反后得到:11000111B
          末位加1后得到:11001000B
          [-111000B]补=11001000B
    

    ③ 将+1111111B的数值部分通过补前0达到8位,即可得到其补码:

          [1111111B]补=01111111B
    

    ④ -10000000B的数值部分已达8位,即10000000B。

          按位取反后得到:01111111B
          末位加1后得到:10000000B
          [-10000000]补=10000000B
    

    ⑤ 用同样方法不难求得:

          [0]补=0
    

    (3)根据补码求真值
    补码最高位为0,则真值数符为“+”,真值数值位与补码其余位相同;补码最高位为1,则真值数符为“-”,将补码所有位按位取反且末位加1后就可得到真值的数值位。
    用这种方法可以方便的将【例1.15】中求得的补码还原为对应的真值

    补码这块有点复杂,以后再说

    4.反码

    反码的最高位表示真值的数符,0表示正,1表示负。当反码最高位为0,则其余位与真值的数值位相同;当反码最高位为1,则其余位是真值的数值位按位取反后的结果。

    #第一次差不多就到这里 了。学不懂,难受。
    在这里插入图片描述在这里插入图片描述附上一张美女,让心情好一点,不然下回自己都不想看这篇博客了。

    展开全文
  • 手把手教你学习汇编语言——从入门到起飞

    万次阅读 多人点赞 2021-05-11 08:07:33
    希望大家看这些找一些样例练习一下会的更好,这里有一些练习题希望能帮助到大家 汇编语言编程题总结 汇编语言环境安装 这里用的是Masm,相比较纯Dosbox会简单很多的 汇编语言和CodeBlock安装包 密码:dqs9 下载...

    专接本交流群:1051749714 (有什么问题欢迎进群讨论)
    关于这篇博客,笔者会尽量用最简单的方式教会大家汇编语言以便应付各种考试
    有什么不足的忘大佬评论或私信指出。

    汇编环境安装
    汇编运行调试
    汇编指令

    希望大家看完这些找一些样例练习一下会学的更好,这里有一些练习题希望能帮助到大家
    汇编语言编程题总结

    汇编语言环境安装

    这里用的是Masm,相比较纯Dosbox会简单很多的
    汇编语言和CodeBlock安装包 密码:dqs9

    下载以后打开运行
    下一步
    在这里插入图片描述
    安装
    在这里插入图片描述
    完成即可
    在这里插入图片描述
    安装完成后打开,进来是默认的程序框

    在这里插入图片描述
    汇编语言运行的话,一定要保存文件到本地才可以运行,调试的话也需要先运行一下才能调试,否则就是调试的上次运行的程序。

    汇编运行调试

    当我们写好以后,它会提示我们先保存在运行
    在这里插入图片描述

    ctrl+s保存在一个地方,记得改名字,把 * 换成名字
    在这里插入图片描述

    再点击运行,出现这个就可以了,这是没有屏幕输出的程序,如果有屏幕输出,还会先输出程序输出的,在输出这一行。
    在这里插入图片描述

    (如果到时候一闪而过,说明你的程序有问题)
    下面会有提示哪一行有问题的,双击就会高亮显示那一行
    (笔者这个就是在AL后面多打了一个S)

    在这里插入图片描述

    运行可以了,那就大概说一下调试的过程(如果要调试的话,一定要先运行一遍才可以,否则就是调试的上一次运行的代码)

    调试的话,输入 T 是运行一步,你可以选择一步一步的运行,
    我们输入一个T 出来的划线位置就是下一次要运行的代码
    我们可以看到命令框第二个划线的 MOV AL,[0000H] 我们的AL赋值是12H 第二次AX的低四位还不是12H
    当我们再输入一个T,才是12H,也就是调试出来的代码是下一次将要运行的代码。
    在这里插入图片描述

    也许有些时候可能会觉得一步一步调试太麻烦了,这里也有直接跳转调试的

    我们之间输入一个U就会出现每一步代码所对应的数。
    在这里插入图片描述

    通过G 在写对应的号,就可以跳转到指定的位置
    在这里插入图片描述

    其他的话,可能会有更方便的,但是笔者认为这些就很够用了。

    软件安装运行调试大概就是到这里了,接下来我们来简述一下基本的命令语句吧

    汇编指令

    先来看一下基本的结构(分号后面的都是注释的,汇编语言用分号注释)

    DATAS SEGMENT	;数据段
        ;此处输入数据段代码  
    DATAS ENDS
     
    CODES SEGMENT	;代码段
        ASSUME CS:CODES,DS:DATAS		;数据段给DS,代码段给CS
    START:			;开始代码
        MOV AX,DATAS	;需要先把DATAAX寄存器,然后再从AXDSDATA不能直接给DS
        MOV DS,AX
        ;此处输入代码段代码
        MOV AH,4CH		;结束语句
        INT 21H
        
    CODES ENDS		;代码段结束
        END START	;结束代码
    
    

    先来说常用的命令符号,如果大家有什么其他命令符使用的话,可以评论或者私信我,我看到会尽快给大家展示出来如何使用

    MOV AL,BL
    这里就是把BL的值放到AL中。
    
     
    

    然后就是类似于C语言的函数
    这个函数就是起个名字加个分号
    汇编语言的函数没有结束的地方,一般如果需要结束的加,就要加一个跳转到其他地方
    如果没有跳转,他就会一直运行到下面

    DATA SEGMENT 
    A DB 12H	;定义两个变量
    B DB 24H
    DATA ENDS 
    CODES SEGMENT 
    	ASSUME DS:DATA,CS:CODES
    START:
    	MOV AX,DATA
    	MOV DS,AX
    	
    	JMP EXIT	;这里就是直接跳转到EXIT  JMP就是跳转的方法
    	
    	MOV AL,A	;A->AL
    	MOV BL,B	;B->BL
    	MOV A,BL	;BL->A
    	MOV B,AL	;AL->B
    	 
    	 
    EXIT:
        MOV AH,4CH
        INT 21H
    CODES ENDS
        END START
    
    
    

    当然还有很多特别的JMP 也就是一些带标志位的 就是标志寄存器里面的六个状态位

    1、进位标志CF(Carry Flag)
    进位标志CF主要用来反映运算是否产生进位或借位。如果运算结果的最高位产生了一个进位或借位,那么,其值为1,否则其值为0使用该标志位的情况有:多字(字节)数的加减运算,无符号数的大小比较运算,移位操作,字(字节)之间移位,专门改变CF值的指令等。
    
    2、奇偶标志PF(Parity Flag)
    
    奇偶标志PF用于反映运算结果中“1”的个数的奇偶性。如果“1”的个数为偶数,则PF的值为1,否则其值为0。
    
    利用PF可进行奇偶校验检查,或产生奇偶校验位。在数据传送过程中,为了提供传送的可靠性,如果采用奇偶校验的方法,就可使用该标志位。
    
    3、辅助进位标志AF(Auxiliary Carry Flag)
    在发生下列情况时,辅助进位标志AF的值被置为1,否则其值为0:
    
    (1)、在字操作时,发生低字节向高字节进位或借位时;
    (2)、在字节操作时,发生低4位向高4位进位或借位时。
    
    对以上6个运算结果标志位,在一般编程情况下,标志位CFZFSFOF的使用频率较高,而标志位PFAF的使用频率较低。
    
    4、零标志ZF(Zero Flag)
    零标志ZF用来反映运算结果是否为0。如果运算结果为0,则其值为1,否则其值为0。在判断运算结果是否为0时,可使用此标志位。
    
    5、符号标志SF(Sign Flag)
    
    符号标志SF用来反映运算结果的符号位,它与运算结果的最高位相同。
    在微机系统中,有符号数采用补码表示法,所以,SF也就反映运算结果的正负号。运算结果为正数时,SF的值为0,否则其值为16、溢出标志OF(Overflow Flag)
    
    溢出标志OF用于反映有符号数加减运算所得结果是否溢出。如果运算结果超过当前运算位数所能表示的范围,则称为溢出,
    OF的值被置为1,否则,OF的值被清为0。 
    (有些时候,有些问题会问你是不是溢出了,这里有个巧计的方法,负数加负数是正数,正数加正数是负数,如果出现这种情况就是溢出了)
    

    然后衍生出来的就是几个条件跳转指令
    一般情况下,条件跳转上面要跟一些影响标志寄存器的命令

    
    JE   ;等于则跳转
    JNE  ;不等于则跳转
     
    JZ   ;0 则跳转
    JNZ  ;不为 0 则跳转
     
    JS   ;为负则跳转
    JNS  ;不为负则跳转
     
    JC   ;进位则跳转
    JNC  ;不进位则跳转
     
    JO   ;溢出则跳转
    JNO  ;不溢出则跳转
     
    JA   ;无符号大于则跳转
    JNA  ;无符号不大于则跳转
    JAE  ;无符号大于等于则跳转
    JNAE ;无符号不大于等于则跳转
     
    JG   ;有符号大于则跳转
    JNG  ;有符号不大于则跳转
    JGE  ;有符号大于等于则跳转
    JNGE ;有符号不大于等于则跳转
     
    JB   ;无符号小于则跳转
    JNB  ;无符号不小于则跳转
    JBE  ;无符号小于等于则跳转
    JNBE ;无符号不小于等于则跳转
     
    JL   ;有符号小于则跳转
    JNL  ;有符号不小于则跳转
    JLE  ;有符号小于等于则跳转
    JNLE ;有符号不小于等于则跳转
     
    JP   ;奇偶位置位则跳转
    JNP  ;奇偶位清除则跳转
    JPE  ;奇偶位相等则跳转
    JPO  ;奇偶位不等则跳转
    
    

    说完跳转类的指令,接下来我们看一看左移右移指令
    左移这种指令左移一位就是二进制左移一位,也就是乘2的操作。

    SHL(Shift Left)SAL(Shift Arithmetic Left): 每位左移, 低位补 0,  高位进 CF
    SHR(Shift Right)     : 每位右移, 低位进 CF, 高位补 0
    SAR(Shift Arithmetic Right)     : 每位右移, 低位进 CF, 高位不变(也就是高位复制到第二位)
    
    使用的时候就是 
    SHL AL,1
    左移一位
    如果移动的位数大于1位,就要放到CX

    循环左移右移

    ;ROL(Rotate Left): 循环左移, 高位到低位并送 CF
    ;ROR(Rotate Right): 循环右移, 低位到高位并送 CF
    ;RCL(Rotate through Carry Left): 循环左移, 进位值(CF)到低位, 高位进 CF
    ;RCR(Rotate through Carry Right): 循环右移, 进位值(CF)到高位, 低位进 CF
    
    使用的时候就是 
    ROL AL,1
    循环左移一位
    如果移动的位数大于1位,就要放到CX

    然后就是加减乘除

    加法add和adc、inc
    ADD AL,BL
    ALBL加起来放到AL
    
    ADC的话就是ADD的运算在家一个CF状态位的值,
    
    INC AL
    AL1
    
    
    减法sub和sbb、dec
    SUB 对应ADD
    SBB 对应ADC
    DEC 对应INC
    用法都是一样的,就是一个是加一个是减
    
    乘法mul和imul
    MUL是无符号乘法
    MUL 8位的   就是AL乘这个数放到AL 高位放到AH
    MUL 16位的   就是AX乘这个数放到AX中	高位放到DX
    
    除法div和idiv
    DIV是无符号除法
    DIV 8位的   就是 AX除这个数,商放AL  余数放AH
    DIV16位的   就是(DX:AX)除这个数,商放AX  余数放DX
    
    异或运算XOR
    
    XOR AL,BL
    ALBL异或运算放入AL
    
    与运算AND   或运算OR都是一样的
    
    然后就是CMPTEST
    CMP 就是对应的减法,但是这个不会影响AL的值,他只会影响状态标志位
    TEST 就是AND的用法,也是不会影响AL,只影响状态标志位
    
    

    最后就是DOS功能的输入输出

    字符输入输出
    
    DATA SEGMENT 
    	 
    DATA ENDS 
    
    CODES SEGMENT 
    	ASSUME DS:DATA,CS:CODES
    START:
    	MOV AX,DATA
    	MOV DS,AX
    	
    	MOV AH,01H	 ;键盘输入的时候,给AH  1
    	INT 21H		 ;然后INT 21H调用,默认输入到ALMOV DL,AL	 ;CMD窗口输出的时候,要把输出的放到DLMOV AH,02H	 ;AH  2
    	INT 21H
    	
    	 
    	 
    EXIT:
       		MOV AH,4CH
            INT 21H
    CODES ENDS
        END START
    
    字符串输入输出
    
    DATA SEGMENT 
    	 BUF DB 20 DUP('$')
    	 BUFF DB 'Hello World!$'
    DATA ENDS 
    
    CODES SEGMENT 
    	ASSUME DS:DATA,CS:CODES
    START:
    	MOV AX,DATA
    	MOV DS,AX
    	
    	MOV DX,OFFSET BUF	;把偏移地址给DX,也可以用 LEA DX,BUF  二者皆可
    	MOV AH,0AH	 ;键盘输入的时候,给AH  10
    	INT 21H		 ;然后INT 21H调用,默认输入到BUFMOV DX,OFFSET BUFF	 ;CMD窗口输出的时候,要把输出偏移地址放到DXMOV AH,09H	 ;AH  2
    	INT 21H
    	
    	 
    	 
    EXIT:
       		MOV AH,4CH
            INT 21H
    CODES ENDS
        END START
    
    展开全文
  • 什么要学习汇编语言?

    千次阅读 多人点赞 2019-10-03 18:49:28
    工作两年,我为什么突然决定要学习汇编呢?在我的一些朋友看来很奇怪,确实,这个选择在我的技术学习生涯里,有点突兀。 我在上篇文章 《计算机非科班工作如何爬出技术的绝望之谷,走向开悟之路》 中聊了下目前...

    一、我学习汇编的缘由

    工作两年后,我为什么突然决定要学习汇编呢?在我的一些朋友看来很奇怪,确实,这个选择在我的技术学习生涯里,有点突兀。

    我在上篇文章 《计算机非科班工作后如何爬出技术的绝望之谷,走向开悟之路》 中聊了下目前学习的瓶颈,决定要学习计算机科班的专业课程,打破认知差距。那么我应该如何选择重点课程,设置这些课程的学习顺序呢?

    其实我最开始是学习了《数据结构算法》和《网络技术》的,这两者比较接近应用层,学习起来问题不大。然后我决定重点攻克《操作系统》,但是我发现在学习过程中涉及到许多偏硬件方面的内容,于是我决定先研究下《计算机组成原理》,但是当看到指令集体系结构这里时,发现有很多指令涉及到寄存器的操作,这些东西都像极了汇编语言,并且我回忆起了Java字节码指令好像也是类似的东西,这一刻我对汇编的好奇心被激发了。

    说实话,汇编语言在我的印象中一直都具有相当的神秘色彩。还记得大学里学习C语言时,开篇就介绍了编程语言的三个层次:机器语言 - 汇编语言 - 高级语言,然后讲汇编语言非常底层,直接和计算机硬件打交道,开发效率低,学习成本高,然后我就再也没有和汇编语言打过交道了。如果我是C/C++开发者,可能对汇编并不陌生,毕竟都是代码是要编译成汇编的,确实有研究的必要。但是Java系语言有虚拟机屏蔽底层细节,且生态太过庞大,我一直没发现有学习汇编的必要。

    但现在,我突然想破除这种神秘感了,我迫切想知道汇编到底是一门怎样的语言,突如其来的好奇心,同时带着一丝兴奋,我开始了汇编语言的学习。


    二、汇编到底有什么用

    上面讲了我学习汇编的来龙去脉,总结下原因主要有两个:
    1.学习底层基础的道路上自然而然地遇到了汇编,并且我相信学习汇编会对我理解底层有一定帮助
    2.对技术的好奇心,使我想要撕掉汇编在脑海里那神秘而朦胧的面纱

    这时,如果稍微带点功利心地问,汇编到底有什么用呢?
    就我自己而言,学习了汇编之后,我觉得它对我的用处主要有这样几点:

    1.学习过程很美妙,真的,我脑海里很多之前看过但却朦胧的技术知识点都变得清晰起来,极大地鼓舞了自己,让我有更大的信心继续深入学习组成原理和操作系统了,这是一次破障的旅行、一次精神上的突破。

    2.我对编程控制计算机运行有了较为深刻地理解:
    什么是寄存器?
    程序在内存和CPU中是怎么折腾的?
    CPU是如何访问内存的?
    代码(程序)和数据CPU是如何区分的?如何分段?
    什么是栈?在内存中如何体现?
    什么中断?什么是中断向量表?

    对传说中的冯.诺依曼体系结构也有了相对具体的认识,能在脑海里建立起有着更多细节的计算机,那些看似抽象的概念逐渐变得清晰。

    真的太值了。

    如果抛开抽象的认知,从实际应用的角度出发,汇编又有什么用武之地呢?结合资料我总结了如下几点:

    1.阅读bootloader代码:基本上,除了OS的核心部分有汇编代码以外,boot loader 的一部分一般是由汇编代码完成,能读懂这些代码对体系架构的理解和设备启动的流程都很有帮助。(Bootloader是嵌入式系统在加电后执行的第一段代码,在它完成CPU和相关硬件的初始化之后,再将操作系统映像或固化的嵌入式应用程序装在到内存中然后跳转到操作系统所在的空间,启动操作系统运行)

    2.分析问题:现在编译器优化很厉害,生成的代码和C代码有时很难又严格的对应,所以在单步跟踪某些问题的时候,需要能够看懂一些汇编语句来分析程序真正执行的流程

    3.性能:在设计及编码中考虑底层的执行流程,从而能编写高性能的代码

    4.破解软件、游戏外挂、计算机病毒、加密、脱壳、逆向工程等

    5.让你觉得能使用高级语言开发是多么幸福的一件事 ~

    当然,这些汇编应用对于大多数开发者而言都是用不到的,但是,我觉得用不到不代表我们对此一无所知就理所当然!如果你真的对技术有所追求,请相信我,花两周时间学学它,一定有所值!


    三、想成为技术高手,一定要懂汇编吗?

    划重点:一定不要神话某些技术!

    这里我就直接引用知乎大神们的回答吧!

    陈然 机器学习、数据挖掘、人工智能 话题的优秀回答者

    大概在另外一拨人的眼里,成为计算机学科的高手应该是把数学学好。你们这群人都只是低端的码农,只有把高等数学学好,精通概率、统计、随机过程、抽象代数,熟练掌握各种建模方法,才是计算机科学的王道。再结合各种领域知识,年薪百万轻轻松松。弄点高级算法几十亿被收购瞬间财富自由。

    技术只是技术本身,计算机发展了这么多年,无数新技术层出不穷。每个人都靠着自己的专长在这个领域发家致富。有的人是因为懂客户需求,有的是擅长做设计,有的人擅长把成熟的技术应用到传统的学科之中。汇编只是这茫茫技术中的一种而已。

    本质上来讲,高手的本身并不是掌握了什么技术,而是能够帮助别人解决问题。一种技术只是解决问题的一种方法,而不是唯一的方法。如果解决这些问题需要精通汇编,那么你一定需要掌握。如果想解决的问题并不需要了解汇编知识,你大可以不掌握。汇编知识与很多其他知识在知识本身这个层次上并无优异之分,只不过在计算机领域更底层一些。

    最后,计算机的基础知识,比如操作系统、数据库、计算机网络、编译原理,该了解的肯定要了解,该入门的要入门。

    至于是否要精通,如果你发现在你成长的过程中遇到的瓶颈,是对于底层的了解,那你就应该精通。

    郭凛 十岁编程,至今二十余年,小成

    一直觉得软件行业有个很有意思的现象,就是绝大多数人都觉得越是懂底层的人就越是牛逼。

    不巧个人十来年前初中时开始用8086/8088汇编写一些小应用,后来大学到工作零零散散也写点,谈不上什么高手。但一直感觉汇编说白了就是一堆的MOV/CMP顶着寄存器和内存做各式各样晦涩的操作,外加INT各类硬件、系统中断满天飞,平时开发都是抱着一本手册四处查各种中断号及flag,熟练点的同事能背下中断,再熟练点的能看机器码如看汇编——一个同事经常自称“看尽天下A(ASM)片,心中自然无码(机器码)”😃。

    个人觉得汇编说白了只不过是门语言而已,和c/java/c++本质上没有区别,只是你使用这门语言必须接触CPU寄存器、需要更好的关注和规划内存使用、需要了解各种硬件和系统级API(中断)、需要写更多行的代码、更容易出错、比高级语言更难写出优美的程序……这些……在我看来,除了让开发者更苦逼之外,实在看不出这门语言的好处。性能?现代编译器下的C语言早已和ASM相差无几。

    如 @张运政 所说,要精通这门语言,确实需要比精通其他语言付出更大的努力,因此精通这门语言的人或许确实厉害,但这并不代表厉害的人一定要精通这门语言——充分不必要。

    我更同意 @吴海波 的答案,编程并不只是操作系统和底层——如果只是这样那软件行业这几十年无数大师们的努力等于白费了,编程语言本身、软件设计、人工智能、软件工程、互联网……等等这些都是让编程变得丰富而有趣的元素。

    是否懂底层不重要,在编程的路上坚持对美的追求,才是通往高手之路。

    大神就是大神,他们的认知水平真的高!值得我们学习!

    所以,这世界上没有什么是必须的,不是说想成为技术高手就非得去学汇编,非得花大力气研究它精通它,你只有根据自己的实际情况,综合权衡。

    学还是不学呢?你会如何选择?反正我学了下,并且不亏 ? ~


    参考资料:

    https://www.zhihu.com/question/23088538
    https://www.zhihu.com/question/20277860/answer/23148163

    展开全文
  • 即使是开始了专门的单片机课程,但是课程的内容与技术文档很相识,指令很多,但是完整的不多,所以完了也不知道,到底为什么要学习编程。很多同学大一就开设了C语言的课,我也上过,但是那时候就是天天几乘几,几...
  • x86汇编上手的第一反应就是古老,但是给人的体验却实在新奇。 与高级语言的区别 首先是你无法声明变量,只能用寄存器,内存(也许还有硬盘,不过涉及IO交互的地方我没有实践过)来实现一个个变量的作用,一写个四五...
  • arm汇编 (汇编)指令是CPU机器指令的助记符,经过编译会得到一串10组成的机器码,可以由CPU读取执行。Arm汇编语言学习文档pdf(中文)讲解了汇编基础知识和常用指令集等等
  • 汇编什么用,不用

    万次阅读 多人点赞 2020-11-13 08:51:00
    前言这是一篇挖坟的文章,原因是有网友又问起来了这个经典问题:“汇编是不是没用啊?不用了吧?” 可能很多人没看过,我就再发一遍吧!汇编语言这门课, 是我大学的一段灰色记忆。有很长一段时...
  • 汇编学习从入门到精通

    万次阅读 多人点赞 2018-02-15 16:08:09
    转载地址: http://blog.csdn.net/yuhengq/article/details/1867602汇编学习从入门到精通 step by step转载 2007年11月05日 14:25:00标签:汇编 /语言 /assembly /工作 /破解 /编程Cracker,一个充满诱惑的词...
  • ARM汇编学习一

    千次阅读 2020-01-30 12:21:52
    我们将使用GNU Binutils工具集中的汇编器as将汇编代码转换为对应的机器码,as会读取后缀为“.s”的汇编源代码文件,然后输出汇编后的二进制目标文件。 编写了后缀为“.s”的汇编文件,可以使用as将它汇编,最后...
  • 什么汇编语言 语言层级的区分 汇编语言的特性 学习汇编真的必要吗 汇编怎么 常有人问:现在基本都使用高级语言了,汇编语言还需要吗?学习汇编语言有什么好处呢?汇编语言看着这么头大,如何学习? 作为自学...
  • 汇编语言学习

    千次阅读 2018-04-26 16:30:38
    随机存储器RAM和只读存储器ROM,随机存储器可读可写,但是必须带电存储,关机存储内容丢失,只读存储器只能读取不能写入,关机其中的内容不丢失 随机存储器用于存放供CPU使用的绝大部分程序和数据,主随机...
  • 学习汇编语言的必要性

    千次阅读 2020-01-27 18:59:39
    汇编语言作为自己程序设计的主流语言是不现实的,当代码量达到一定程度,代码的维护会变困难,甚至不可能实现。 但我们仍要学习汇编语言,但学习汇编的目的不是用它去进行实实在在的程序设计,而是充分获得底层...
  • 这是一个非常有争议的问题,以前有人推崇汇编,是因为他不会C,有人也说有的人说不能用汇编写大的程序是因为他没有学好汇编。我希望你看过这个页面之后不要再去寻找是学汇编还是学C的答案。
  • 汇编语言学习之路——汇编基础

    千次阅读 2018-06-27 23:17:54
    总结:CPU如何处理我们定义的段中的内容,是当作指令执行,当作数据访问,还是当作栈空间,完全是靠程序中具体的汇编指令,和汇编指令对CS:IP、SS:SP、DS等寄存器的设置来决定的。 第7章 更灵活的定位内存地址...
  • 汇编有兴趣的小伙伴可以看看哦,里面有基础的汇编知识25节,并且会汇编知识C语言,你会有和同样C的人有不一样的境界。
  • 到底什么是Cortex、ARMv8、arm架构、ARM指令集、soc?一文帮你梳理基础概念【科普】 1. 从0开始ARM-安装Keil MDK uVision集成开发环境
  • 汇编编程学习

    2013-03-11 16:48:46
    查询从地址6000:0078H开始的100个内存字节单元是否有字符 'a',如果有则把第一个含此指定字符的存储单元的偏移地址送到3000:0022H单元中,并且将 'a' 转换为大写输出到屏幕;如没有找到则把0BBBBH送到3000:0055H...
  • 大家看可以达到如下能力:http://alantop.5166.info/asm_tutorial/asm_tutorial.html1. 彻底搞明白汇编语言2. 可以独立进行逆向工程我会尽量通过有声视频从简单到复杂的把教程放上去。另外,有朋友问的多的问题我...
  • 1、汇编需要什么工具和程序,到哪里下载? 目前阶段,汇编程序仅需要两个程序就够了。masm.exe,link.exe。 前者是编译程序,者是链接程序。另外,为了验证和调试程序,还需要一个程序debug.exe,该程序由windows...
  • 什么学习汇编

    千次阅读 2017-04-07 20:34:18
    当你了太多的高级编程语言时,不妨汇编,这门低级语言
  • 汇编 MASM 汇编器 链接器 32 位保护模式 64 位模式 16 位实地址模式 所有 x86 处理器都理解共同的机器语言 汇编语言不是可移植的,因为它是为特定处理器系列设计的 每一种都基于一个处理器系列 由于汇编语言占用内存...
  • 如题,下面是一篇汇编网上关于学习完汇编之后学那门语言的文章,反过来,要想深入理解C语言用不用学习汇编?想研究C语言的机制,用不用有汇编的基础?文章原文:学习计算机知识的目的是为了使用计算机解决问题。为了...
  • 对于ARM汇编语言的初学者来说,找到一个简单好用的学习环境很重要,就像学习C++可以使用微软的Visual Studio 或者其它的开发环境一样,学习ARM汇编语言有没有类似的软件,并且不需专门购买开发板或编程器等硬件,一...
  • 使用VSCode学习汇编语言

    千次阅读 多人点赞 2020-08-25 15:42:50
    16位/32位汇编语言开发工具 中文|English ????在学习《微型计算机原理与接口技术》的汇编语言部分时,苦于没有比较顺手的编程环境,此插件实现了在VSCode中对DOSBox等汇编工具的快速调用。主要功能特性如下: 同时...
  • 在掌握基本的汇编语言程序设计方法之后进一步学习如何提PPT学习教案.pptx
  • 汇编学习

    万次阅读 2020-06-02 23:12:32
    一. 几个单位 DATA 字节 8位 WORD 字 16位 DWORD 双字 32位 二. 八个通用寄存器 32位 16位 8位 EAX AX AL ECX CX CL EDX DX DL EBX BX BL ESP SP AH ...三. 几条汇编指令 mov add sub ...
  • 8086汇编学习

    千次阅读 2017-11-19 13:56:15
    8086汇编学习资料:《汇编语言》——王爽debug相关Debug 是DOS,Windows 都提供的实模式(8086方式)程序的调试工具,使用他可以查看CPU各种寄存器中的内容,内存的情况和在机器码级跟踪程序的运行。 win10 win7...
  • ​ 这学期要学习8086汇编,选择汇编的环境折腾了好几天,尝试过使用吾爱破解的OD反汇编工具【1】查看寄存器的状态,并进行的简单的汇编指令编写,但其界面复杂,对新手极其不友好,使用了几天就放弃了。...
  • 在C++中学习汇编语言

    2020-07-07 18:06:47
    汇编的分类 汇编指令 mov call

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 113,909
精华内容 45,563
关键字:

学完汇编之后学什么