汇编由以下3类组成: 1 汇编指令(机器码的助记符) 2 伪指令 (由编译器执行) 3 其他符号 (由编译器识别) 汇编语言的核心是汇编指令,它决定了汇编语言的特性 CPU是计算机的核心部件 一个CPU有N根地址总线,则可以说这个CPU的地址总线的宽度为N 这样的CPU最多可以寻找2的N次方个内存单元。 CPU与内存或其他器件之间的数据传送是通过数据总线来进行的。
jmp boot_begin func0 db 'Hk_Mayfly----XIUXIUXIU~',0 func1 db '1) reset pc',0 func2 db '2) start system',0 func3 db '3) clock',0 func4 db '4) set clock',0 ;相减得到的是标号的相对位置 func0-offset boot+7e00h dw offset func1-offset boot+7e00h dw offset func2- clock1 db 'F1----change the color ESC----return menu',0 clock2 db 'Please input bx,0 push bx retf jmp choose ;题中对引导现有的操作系统的描述是调用int 19,这里为了方便就直接写成函数了 choose_func2:
1 assume cs:code,ss:stack 2 stack segment 3 db 128 dup (0) 4 stack ends 5 code segment db '2) start system',0 29 func3 db '3) clock',0 30 func4 db '4) set clock',0 31 boot+7e00h 33 dw offset func1-offset boot+7e00h 34 dw offset func2- offset func4-offset boot+7e00h 37 time db 'YY/MM/DD hh:mm:ss',0 38 cmos db 9,8,7,4,2,0 39 clock1 db 'F1----change the color ESC----return menu',0 40 clock2 db 'Please
且每个段都需要段名 段名 segment--段的开始 段名 ends--段的结束 assume假设 含义是假设某一段寄存器和程序中我们定义的段名关联起来 可以理解为和变量的引用一个意思 利用汇编程序计算2^ 3 assume cs:code code segment mov ax,2 add ax,ax add ax,ax code ends end 汇编程序的编写不是我学习的重点,这里直接跳过 需要的可以自己去看一下 偏移地址在方括号里面 操作单位看对应的指令操作符 ()表示一个内存单元或寄存器中的内容 (ax)表示ax的内容 (21000h)表示内存单元2000:1000处的内容 push ax (sp) = (sp)-2 loop指令 功能:实现循环(计数型循环) 计数通过判断cx寄存器的值 如果不为0则转至标号处执行程序 如果为0则继续向下执行 如 assume cs:code code segment mov ax,2 ax,2000h mov ds,ax mov bx,0 mov al,ds:[bx] 所以以后我们在遇到写入内存单元的值时候,如果idata是常量,则需要显式地标明段寄存器 ds cs ss es在汇编语言中都称为段前缀
伪指令,可以为每一个或多个有符号或无符号字节分配存储空间,每个初始值必须是8位整数表达式或字符常量,例如下面的定义: .data var1 BYTE 'A' ; 定义字符常量 var2 .data string1 BYTE "hello lyshark",0h string2 BYTE "good night",0h 00F23000 68 65 6C 6C 6F 20 6C .const var1 BYTE "hello world",0h ; 初始化为BYTE的字符串 var2 DWORD 10 ; 初始化为10的DWORD类型 var3 DWORD 100 dup(1,2) ; 200个DWORD的缓冲区 var4 BYTE 1024 dup(?) listsize = ($ - list) ; 计算字节数据大小 .data list WORD 1000h,2000h,3000h,4000h listsize = ($ - list) /2
定义有符号字节)伪指令,可以为每一个或多个有符号或无符号字节分配存储空间,每个初始值必须是8位整数表达式或字符常量,例如下面的定义:.data var1 BYTE 'A' ; 定义字符常量 var2 data string1 BYTE "hello lyshark",0h string2 BYTE "good night",0h00F23000 68 65 6C 6C 6F 20 6C 79 const var1 BYTE "hello world",0h ; 初始化为BYTE的字符串 var2 DWORD 10 ; 初始化为10的DWORD类型 var3 DWORD 100 dup(1,2) ; 200个DWORD的缓冲区 var4 BYTE 1024 dup(?) listsize = ($ - list) ; 计算字节数据大小.data list WORD 1000h,2000h,3000h,4000h listsize = ($ - list) /2
汇编语言的2号功能函数有小小的坑点,需要格外注意一下。 mov ah,2 int 21h 某些dos版本下,该功能函数会返回一个值并存在al中。 如果不注意这一点,有时候就会出错。 call print MOV AH,4CH INT 21H print proc push dx mov dl,ah ;入口参数是ax mov ah,2 int 21h mov dl,al mov ah,2 int 21h pop dx ret print endp CODES ENDS END START pressed standard output is always the screen under DOS 1.x, but may be redirected under DOS 2+
汇编语言与计算机硬件的关系密切,每一条汇编语句都对应着底层的机器指令,直接操作计算机的寄存器和内存。 汇编语言在计算机编程的历史上扮演着重要的角色。 为什么学习汇编语言 虽然现代编程中使用高级编程语言更为普遍,但学习汇编语言仍然具有很多重要的理由: 底层控制: 汇编语言允许程序员直接控制计算机硬件,理解计算机的工作原理。 逆向工程: 在计算机安全领域,汇编语言是逆向工程师的必备技能。了解汇编语言可以帮助发现和分析恶意软件或未知的二进制程序。 专栏内容概览 在《底层之旅:汇编语言探秘》博客专栏中,我们将涵盖丰富多样的内容,适合初学者和有编程经验的开发者: 汇编语言基础:从基本概念入手,介绍计算机体系结构、寄存器、内存和汇编语言的基本语法。 汇编语言应用与案例:探讨汇编语言在操作系统、嵌入式系统、计算机安全等领域的应用。通过实际案例,您将了解汇编语言在现实世界中的应用场景。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
3.汇编语言 (1) 定义 为了便于记忆和阅读 ,使用字母和符号来表示机器语言的命令 ,用十进制数或六数来表示据 ,这样的计算机程序设语言就称为汇编语言 。 (2) 汇编语言与机器语言程序的关系 一条汇编语言与一条机器语言指令对应,汇编语言程序与机器语言效率相同 案例:对于前述的4×6+40算式运算,如果把机器语言程序改写为汇编语言程序,则为以下两条汇编指令 2.在计算机系统中,某些功能必须用汇编语言程序来实现。 如:机器自检、系统初始化、实际的输入输出设备的操作等。 例如:222从右边开始,第一个2表示2个1,第二个2表示有2个10,第三个2表示有2个100. 将各个位置上所表示的基本数值称为位权,简称权。 不同的进位制和不同的位置其位权是不同的。 (2) 除基取余法~这种转换方法同样适合于其它进制数之间的转换。 2. 十进制小数转换为二进制数 (1)减权定位法 (2)乘基取整法 3.
如果想了解更多物联网、智能家居项目知识,可以关注我的项目实战专栏。 欢迎关注公众号,喜欢就点一点 在看 吧。
介绍 汇编是一类编程语言,每种cpu对应一种cpu语言,这些语言语法大同小异,指令集有所不同, 那么这些cpu语言统称为汇编语言,与java,c++,python等高级语言无异, 只不过汇编更加接近硬件 需要借助寄存器, 更改寄存器当中的数据间接地操控cpu和内存 寄存器的数量 在高级语言中如果要对两个变量进行数据交换,我们通常的做法是使用一个temp临时变量,比如: int a=1; int b=2; 内存条容量: 既然每个内存单元占的空间是固定的, 那么内存容量越大,房间自然就越多 给房间贴门牌号 0x1 0x2 0x3 ... 0x10 0x20 ... 0x100 0x200 ... 0x1000 其实只要知道下面的规则就不会产生疑惑了: 在内联汇编中,操作数通常用数字来引用,具体的编号规则为:若命令共涉及n个操作数,则第1个输出操作数(the first output operand)被编号为0,第2个 具体到上面的示例代码中,根据上下文,涉及到2个操作数变量a、b,这段汇编代码的作用是将a的值赋给b,可见,a是input operand,而b是output operand,那么根据操作数的引用规则,不难推出
汇编语言是一种低级编程语言,与计算机硬件直接相关。相比其他高级编程语言,如Java、Python或C++,汇编语言在语法、规则和表达方式上有着显著的不同。 下面我们将探讨汇编语言与其他语言的不同以及汇编语言的作用,并给出一些汇编语言的示例。 一、与其他语言的不同 硬件相关性:汇编语言直接与计算机硬件接口,因此它具有更高的硬件相关性。 执行效率:汇编语言编写的程序通常比其他高级语言编写的程序执行效率更高。这是因为汇编语言直接与硬件指令集相对应,从而能够更有效地利用计算机资源。 二、汇编语言的作用 系统级编程:在操作系统、驱动程序和嵌入式系统等底层软件的开发中,汇编语言是必不可少的。由于这些软件需要直接与硬件交互,因此使用汇编语言能够提供更高的执行效率和更精细的控制能力。 三、汇编语言示例 下面是一个简单的x86汇编语言的示例程序,该程序在屏幕上打印出“Hello, World!”
参考书籍《汇编语言》王爽 著/清华大学出版社 一、基础知识 1、汇编指令是机器指令的助记符,同机器指令一一对应 2、每一种CPU都有自己的汇编指令集 3、CPU可以直接使用的信息在存储器中存放 地址总线:地址总线的宽度决定了CPU的寻址能力 比如8086cpu,它的地址总线宽度为20,所以它的寻址能力是2^20 = 2^10 * 2^10 = 1024 * 1024 = 1M 怎么理解? _B,__2__B,__4__B 4、从内存中读取1024字节的数据,8086至少要读__512__次,80386至少要读取__256__次. 2、对程序员来说,CPU中最主要部件是寄存器,可以通过改变寄存器的内容来实现对CPU的控制; 不同的cpu,寄存器的个数、结构是不同的。 比如8086是16位结构的cpu, 8086有14个16位的寄存器,每个可以存放2个字节。 ?
机器语言-汇编语言-高级语言 汇编语言特点: 1 与硬件相关 2 与机器指令一一对应 3 须详细描述如何做 4 可移植性差 CPU功能结构: 总线接口部件BIU 执行部件EU CPU寄存器结构:
2.-a指令 用法:-a [内存地址] 作用:从指定地址开始逐条输入汇编语句并汇编成机器码存入内存中,若地址缺省,则在上一条指令的最后一条指令之后输入汇编语句。
Clear Carry Flag):CF←0 b、置进位指令STC(Set Carry Flag):CF←1 c、进位取反指令CMC(Complement Carry Flag):CF←not CF 2、 例5.3 已知有二个32位数d1和d2(用数据类型DD说明),编写程序片段把d2的值加到d1中。 解:32位数d1和d2在内存中如下所示。 ? MOV DX, word ptr d1+2 ;(DX,AX)构成一个32位数据 ADD AX, word ptr d2 ;低字相加 ADC DX, word ptr d2 +2 ;高字相加。 方法2:用32位寄存器编写程序 MOV EAX, d1 ADD EAX, d2 MOV d1, EAX 从上面两段程序不难看出:用32位寄存器来处理
2 IP=IP+所读取指令的长度,从而指向下一条指令; 3 执行指令。转到1 重复这个过程。
2CPU对它们进行读或写的时候都通过控制线发出内存读写命令。 8086CPU内存分配如下: 对CPU来讲,系统中的所有存储器中的存储单元都处于一个统一的逻辑存储器中,它的容量受CPU寻址能力的限制。
2.add指令 add指令用于实现两个数的加法,比如 add ax,bx 该指令会将bx中的值加到ax上,并且结果会保存在ax中。 举个例子: and ax,0000000011111111B or bl,11111111B 汇编中的数据 汇编语言支持数字型数据和字符型数据。 数字型数据支持3种数制,包括10进制,16进制和2进制,可以靠后缀来区分。10进制没有后缀,16进制后缀为H,2进制后缀为B,后缀不区分大小写。