汇编语言
文章平均质量分 78
这个专题是在学习《汇编语言》王爽第三版过程中整理得到。
你回到了你的家
这个作者很懒,什么都没留下…
展开
-
2021-02-26
一、汇编语言基本组成部分1.1 第一个汇编程序汇编语言编程可能以晦涩难懂而著称,但我们喜欢用另一种方式来看待它,它是一种提供几乎全部信息的语言。你可以看到正在发生的一切,甚至在CPU的寄存器和标志!然而,有了这个强大的功能,您就有责任管理数据表示细节和指令格式。你的工作非常细致。要了解这是如何工作的,让我们看一个简单的汇编语言程序,它将两个数字相加并将结果保存在寄存器中。我们称之为AddTwo程序:main PROC mov eax,5 add eax,6 INVOKE ExitProcess原创 2021-02-26 17:16:39 · 252 阅读 · 0 评论 -
2.4~5 x86计算机的组成
一、x86计算机的组成成分1.1 主板(motherboard)微型计算机的核心是它的主板,这是一块平板电路板,上面放置着计算机的CPU、支持处理器(芯片组)、主存储器、输入输出连接器、电源连接器和扩展槽。各种组件通过总线相互连接,总线是直接蚀刻在主板上的一组电线。PC市场上有几十种主板,扩展能力、集成组件和速度各不相同。传统上,PC主板上有以下组件:CPU插槽。插槽的形状和大小不同,这取决于它们支持的处理器类型内存插槽(SIMM或DIMM),容纳小型插入式内存板BIOS(basic input原创 2021-02-17 18:34:58 · 766 阅读 · 0 评论 -
5.4Irvine32库
一、创建这个库的原因目前为止还没有微软官方支持的汇编语言编程库。当程序员在1980年代开始在x86处理器上编写汇编语言时,MS-DOS是最常用的操作系统。当时的16位的程序能够调用MS-DOS方程(被称为INT 21h服务)来进行简单的输入和输入。但是在当时,如果我们想要在控制台输出一个整数,那么我们需要写一个相当长的程序,这个程序需要将我们的整数转化为ASCⅡ字符,我们把这个程序称为WriteInt,程序的实现逻辑如下:初始化:let n equal the binary valuelet buf原创 2021-01-30 19:26:40 · 849 阅读 · 3 评论 -
2.1~3 32位及64位x86处理器介绍
这篇文章着重介绍32位x86处理器的各种基本特征,32位x86处理器包括了Intel IA-32处理器以及AMD 32位处理器。一、运行模式x86处理器有三种基本的运行模式:保护模式(protected mode)、实地址模式(real-address mode)和系统管理模式(system management mode)。此外,还有一种称为virtual-8086的子模式,这个子模式是保护模式的一个特殊变种。接下来简要介绍下每种模式:保护模式保护模式是处理器最初始的运行模式。在保护模式下, a原创 2021-01-30 15:33:48 · 1970 阅读 · 0 评论 -
8.2 汇编栈帧
一、堆栈框架堆栈框架(stack frame)也称为活动记录(activation record),它是为传递的参数、子例程的返回地址、局部变量和保存的寄存器保留的堆栈空间。堆栈框架是按以下步骤创建的:如果有传递的参数,则压入堆栈子例程被调用,子例程的返回地址压入堆栈子例程在开始执行时,EBP被压入堆栈EBP设为ESP的值,从这时开始,EBP就被作为寻址所有子例程参数的基址指针使用了如果有局部变量,ESP减去一个数值,以便在堆栈上为局部变量保留空间如果任何寄存器需要保存,则压入堆栈1.1原创 2021-01-27 22:56:45 · 837 阅读 · 1 评论 -
AT&T与intel汇编格式区分
操作数赋值方向在intel语法中,第一个操作数表示目的操作数,第二个操作数表示源操作数,赋值方向从右向左。而在AT&T语法中,第一个操作数表示源操作数,第二个操作数表示目的操作数,赋值方向从左到右。例:将ebx赋值给eaxintelat&tmov eax,ebxmovl %ebx,%eax指令前缀在intel语法中寄存器和立即数不需要前缀,而AT&T语法中寄存器需要加前缀%,立即数需要加前缀$例:将1赋值给eax寄存器intelat&原创 2021-01-27 10:59:02 · 557 阅读 · 0 评论 -
实验7 寻址方式在结构化数据访问中的应用
Power idea公司从1975年成里一直到1995年的基本情况如下:下面的程序中,已经定义好了这些数据:assume cs:codesgdata segment db '1975','1976','1977','1978','1979','1980','1981','1982','1983' db '1984','1985','1986','1987','1988','1989','1990','1991','1992' db '1993','1994','1995'原创 2021-01-14 10:26:24 · 197 阅读 · 0 评论 -
实验9-编程显示字符串
要求:在屏幕中间分别显示绿色、绿底红色、白底蓝色的字符串’welcom to masm!’编程所需的知识如下:内存地址空间中,B8000H~BFFFFH共32KB的空间,为80×2580\times2580×25彩色字符模式的显示缓冲区。向这个地址空间写入数据,写入的内容将立即出现在显示器上。80×2580\times2580×25代表显示器可以显示25行,每行80个字符。每个字符有256种属性(背景色、前景色、闪烁、高亮等信息),所以一个字符在显示缓冲区要占两个字节,分别存放字符的ASCⅡ码和属原创 2021-01-13 17:28:26 · 756 阅读 · 0 评论 -
13-int指令
一、int指令int指令的格式为int n,n为中断类型码,它的功能是引发中断过程。CPU执行int n指令,相当于引发一个n号中断的中断过程,执行过程如下:取中断类型码n标志寄存器入栈,IF=0,TF=0CS、IP入栈(IP)=(n*4), (CS)=(n*4+2)从此处转去n号中断的中断处理程序。可以在程序中使用int指令调用任何一个中断的中断处理程序。例如,下面的程序:assume cs:codecode segmentstart: mov ax,0b00h mov原创 2021-01-07 19:44:56 · 3566 阅读 · 0 评论 -
实验1-利用Debug查看CPU寄存器和内存+利用机器指令和汇编指令编程
一、预备知识:Debug的使用1.1 什么是Debug?Debug是DOS、Windows都提供的实模式(8086方式)程序的调试工具。使用它,可以查看CPU各种寄存器中的内容、内存的情况和在机器码级跟踪程序的运行。1.2 将用到的Debug功能用Debug的R命令查看、改变CPU寄存器的内容用Debug的D命令查看内存中的内容用Debug的E命令改写内存中内容用Debug的U命令将内存中的机器指令翻译成汇编指令用Debug的T命令执行一条机器指令用Debug的A命令以汇编指令的格式在内原创 2020-12-03 16:30:25 · 6039 阅读 · 0 评论 -
9-汇编转移指令-offset+jmp+jcc+loop
可以修改IP,或同时修改CS和IP的指令统称为转移指令。概括地讲,转移指令就是可以控制CPU执行内存中某处代码的指令。8086CPU的转移行为有以下几类:只修改IP时,称为段内转移,比如:jmp ax同时修改CS和IP时,称为段间转移,比如:jmp 1000:0由于转移指令对IP的修改范围不同,段内转移又分为:短转移和近转移:短转移IP的修改范围为-128~127近转移IP的修改范围为-32768~327678086CPU的转移指令分为以下几类:无条件转移指令(如:jmp)条件转原创 2020-11-18 09:58:38 · 4083 阅读 · 1 评论 -
汇编语言指令
一、跳转指令跳转指令分为三类:无条件跳转:JMP根据CX、ECX寄存器的值跳转:JCXZ(CX为0则跳转)、JECXZ(ECX为0则跳转)根据EFLAGS寄存器的标志位跳转,这个特别多。根据标志位跳转的指令:JE:等于则跳转JNE:不等于则跳转J:为0则跳转JNZ:不为0则跳转JS:为负则跳转JNS:不为负则跳转JC:进位则跳转JNC:不进位则跳转JO:溢出则跳转JNO:不溢出则跳转JA:无符号大于则跳转JNA:无符号不大于则跳转JAE:无符号大于等于则跳转JNA原创 2020-11-12 16:25:44 · 3526 阅读 · 1 评论 -
32位寄存器用法介绍
一、寄存器介绍32位CPU所含有的寄存器有:8个32位通用寄存器,其中包含4个数据寄存器(EAX、EBX、ECX、EDX)、2个变址寄存器(ESI和EDI)和2个指针寄存器(ESP和EBP)6个段寄存器(ES、CS、SS、DS、FS、GS)1个指令指针寄存器(EIP)1个标志寄存器(EFLAGS)二、通用寄存器每个寄存器都可作为一个32位值或两个16位值来寻址使用。某些16位的寄存器能够按照8位值寻址使用。EAX的低16位称为AX,AX的高8位称为AH,低8位称为AL。321原创 2020-11-12 13:58:16 · 5813 阅读 · 0 评论 -
nasm汇编
一、简介汇编的语法风格,主要取决于低层硬件和使用的汇编器。汇编指令的两大风格分别是Intel汇编与AT&T汇编,分别被Microsoft Windows/Visual C++与Linux/gcc采用。nasm是一种汇编器,用于将汇编程序转化成机器代码,它在AT&T汇编语言风格的基础上加入了自己独特的部分。二、指令2.1 BITS‘BITS’指令指定NASM产生的代码是被设计运行在16位处理器上还是运行在32位处理器上。语法是’BITS 16’或’BITS 32’,在大多数情况下,我们原创 2020-11-11 09:34:42 · 1089 阅读 · 0 评论 -
12-内中断
任何一个通用的CPU,比如8086,都可以在执行完当前正在执行的指令之后,检测到从CPU外部发送过来的或内部产生的一种特殊的信息,并可以立即对所接收到的信息进行处理。这种特殊的信息,我们可以称其为中断信息。中断的意思是指,CPU不再接着(刚执行完的指令)向下执行,而是转去处理这个特殊信息。中断信息可以来自CPU的内部和外部,我们在这里主要讨论来自于CPU内部的中断信息。一、内中断的产生对于8086CPU,当CPU内部有下面的情况发生的时候,将产生相应的中断信息。除法错误,比如执行div指令产生的除原创 2020-10-26 17:41:30 · 878 阅读 · 0 评论 -
11-标志寄存器+adc/sbb+cmp+条件转移指令
CPU内部的寄存器中,有一种特殊的寄存器(对于不同的处理机,个数和结构都可能不同)具有以下三种作用:用来存储相关指令的某些执行结果用来为CPU执行相关指令提供行为依据用来控制CPU的相关工作方式这种特殊的寄存器在8086CPU中,被称为标志寄存器。8086CPU的标志寄存器有16位,其中存储的信息通常被称为程序状态字(PSW)。在后面我们将标志寄存器简称为flag。flag和其他寄存器不一样,其他寄存器都是用来存放数据的,都是整个寄存器具有一个含义。而flag寄存器是按位起作用的,也就是说,,原创 2020-10-26 07:47:26 · 1255 阅读 · 0 评论 -
6-汇编语言中段的使用+dw+start标号
在操作系统的环境中,合法地通过操作系统获得的空间都是安全的,因为操作系统不会让一个程序所用的空间和其他程序以及系统自己的空间相冲突。在操作系统允许的情况下,程序可以取得任意容量的空间。一、在代码段中使用数据考虑这样一个问题,编程计算以下8个数据的和,结果存在ax寄存器中:0123h、0456h、0789h、0abch、0defh、0fedh、0cbah、0987h之前处理这样的过程我们都是累加某些内存单元中的数据,并不关心数据本身。可现在要累加的就是已经给定了数值的数据。我们可以将它们一个一个加到原创 2020-10-22 10:25:04 · 2209 阅读 · 1 评论 -
7-汇编大小写字符互相转化+[bx+idata]+SI/DI
一、and和or指令1.1 and指令:逻辑与指令,按位进行与运算1.2 or指令:逻辑或指令,按位进行或运算三、以字符形式给出的数据我们可以在汇编程序中,用’…'的方式指明数据是以字符的形式给出的,编译器将它们转化为相对应的ASCⅡ码。如下面的程序:程序7.1assume cs:code,...原创 2020-10-21 09:46:58 · 1945 阅读 · 0 评论 -
8-汇编语言数据长度及寻址-bx/si/di/bp+ss+ptr+div+dd+dup
这两个基本问题是:处理的数据在什么地方?要处理的数据有多长?这两个问题,在机器指令中必须给以明确或隐含的说明,否则计算机就无法工作。接下来就针对8086CPU对这两个基本问题进行讨论。在这里定义两个描述性符号:reg和sreg为了描述简洁,在后面我们都将使用reg来表示一个寄存器,用sreg来表示一个段寄存器一、bx、si、di和bp二、机器指令处理的数据在什么地方三、汇编语言中数据位置的表达汇编语言中用3个概念来表达数据的位置。3.1 立即数(idata)对于直接包含在机器指原创 2020-10-21 09:31:30 · 2101 阅读 · 0 评论 -
10-ret/retf+call+mul
call和ret都是转移指令,它们都修改IP,或同时修改CS和IP。它们经常被共同用来实现子程序的设计。一、ret和retfret指令用栈中的数据,修改IP的内容,从而实现近转移。retf指令用栈中的数据,修改CS和IP的内容,从而实现远转移。CPU执行ret指令时,进行下面两步操作:(IP)=((ss)*16+(sp))(sp)=(sp)+2CPU执行retf指令时,进行下面4步操作:...原创 2020-10-21 09:18:04 · 802 阅读 · 0 评论 -
BX+CX+loop
[bx]和内存单元的描述定义的描述性符号:“()”约定符号idata表示常量一、[BX]二、Loop指令loop指令的格式是:loop 标号,CPU执行loop指令的时候,要进行两步操作:(cx)=(cx)-1判断cx中的值,不为零则转至标号处执行程序,如果为零则向下执行。从上面的描述中,可以看到,cx中的值影响着loop指令的执行结果。通常我们用lool指令来实现循环功能,cx中存放循环次数。接下来通过一个程序来看下loop指令的具体应用:任务1:编程计算222^222,原创 2020-10-21 09:01:28 · 420 阅读 · 0 评论 -
VMware Workstation 不可恢复错误: (vcpu-0) vcpu-0:VERIFY vmcore/vmm/main/cpuid.c:376 bugNr=1036521
这个问题的原因有几个,第一个原因就是网上说的要开启BIOS的Interl virtual technology,而我当时开启了之后依然报错,最后找到问题的原因在VMWare Workstation右键我们的虚拟机,选择最下面的设置,然后注意上图的右下角有一个虚拟化Intel VT-X/EPT或AMD-V/RVI(V),将这个选项勾选后就可以成功启动了。...原创 2020-10-20 15:53:23 · 6464 阅读 · 1 评论 -
汇编程序基本结构+利用DOS系统编译连接汇编程序
一、一个源程序从写出到执行的过程1.1 编写汇编源程序使用文本编辑器(如Edit、记事本等),用汇编语言编写汇编源程序。这一步工作的结果是产生了一个存储源程序的文本文件1.2 对源程序进行编译连接使用汇编语言编译程序对源程序文件中的源程序进行编译,产生目标文件;再用连接程序对目标文件进行连接,生成可在操作系统中直接运行的可执行文件。可执行文件包括两部分内容:程序(从源程序中的汇编指令翻译来的机器码)和数据(源程序中定义的数据)相关的描述信息(比如,程序有多大、要占用多少内存空间等)原创 2020-10-19 19:07:06 · 2019 阅读 · 0 评论 -
3-汇编语言中与内存访问相关的寄存器/操作(DS+数据段+SS/SP+栈相关操作)
一、内存中字的存储二、DS和[address]下面详细说明指令的含义。mov a1, [0]前面我们使用mov指令,可完成两种传送:将数据直接送入寄存器将一个寄存器中的内容送入另一个寄存器也可以使用mov指令将一个内存单元中的内容送入一个寄存器中。从哪一个内存单元送到哪一个寄存器中呢?在指令中必须指明。寄存器用寄存器名来指明,内存单元则需用内存单元的地址来指明。显然,此时mov指令的格式应该是:mov 寄存器名,内存单元地址[...]表示一个内存单元,[...]中的0表示内存单原创 2020-10-19 08:28:26 · 2504 阅读 · 0 评论 -
汇编语言寄存器相关知识(AX/BX/CX/DX+mov/add+物理地址+段+CS/IP+jmp)
一、通用寄存器一个16位寄存器可以存储一个16位的数据,数据在寄存器中的存放情况如图2.2所示。8086CPU的上一代CPU中的寄存器都是8位的,为了保证兼容,使原来基于上代CPU编写的程序稍加修改就可以运行在8086之上,8086CPU的AX、BX、CX、DX这4个寄存器都可分为两个可独立使用的8位寄存器来用:AX可分为AH和ALBX可分为BH和BLCX可分为CH和CLDX可分为DH和DL以AX为例,8086CPU的16位寄存器分为两个8位寄存器的情况如图2.3所示:二、.原创 2020-10-18 19:53:00 · 6986 阅读 · 0 评论 -
汇编语言基础知识
一、机器语言机器语言是机器指令的集合。机器指令展开来讲就是一台机器可以正确执行的命令。电子计算机的机器指令是一列二进制数字。计算机将之转变为一列高低电平,以使计算机的电子器件受到驱动,进行运算。显然机器码晦涩难懂,不易查错。二、汇编语言的产生汇编语言的产生就是为了解决使用机器语言带来的麻烦。它的主体是汇编指令。汇编指令和机器指令的差别在于指令的表示方法上。汇编指令是机器指令便于记忆的书写格式。(寄存器,简单地讲是CPU中可以存储数据的器件,一个CPU中有多个寄存器。AX是其中一个寄存器的代号原创 2020-10-18 10:58:27 · 1982 阅读 · 0 评论