汇编指令

编程语言分类

走远了吗. 提交于 2019-12-18 09:57:01
[TOC] 目录: 一 引子 二 编程语言分类: 2.1 机器语言 2.2 汇编语言 2.3 高级语言 2.3.1 编译型 (如C语言) 2.3.2 解释型 (如Python) 2.4 总结 #一 引子 ​ 基于上一章所学,有了计算机硬件,再在硬件之上安装好操作系统,我们就有了一个应用程序的运行平台,我们接下来的任务就是学习如何使用某款编程语言来开发应用程序。 ​ 本章的主题是先带大家了解下编程语言,然后重点介绍python这门编程语言 插图:恶搞图01 二 编程语言分类: 2.1 机器语言 机器语言是站在计算机(奴隶)的角度,说计算机能听懂/理解的语言,而计算机能直接理解的就是二进制指令,所以机器语言就是直接用二进制编程,这意味着机器语言是直接操作硬件的,因此机器语言属于低级语言,此处的低级指的是底层、贴近计算机硬件(贴近代指需要详细了解计算机硬件细节、直接控制硬件),详解如下 #机器语言 用二进制代码0和1描述的指令称为机器指令,由于计算机内部是基于二进制指令工作的,所以机器语言是直接控制计算机硬件。 用机器语言编写程序,编程人员要首先熟记所用计算机的全部指令代码以及代码的含义,然后在编写程序时,程序员得自己处理每条指令和每一数据的存储分配和输入输出,还得记住编程过程中每步所使用的工作单元处在何种状态。这是一件十分繁琐的工作。编写程序花费的时间往往是实际运行时间的几十倍或几百倍

汇编语言笔记05-[bx]和loop指令

自古美人都是妖i 提交于 2019-12-18 08:14:14
转载必须注明出处,违者必究。 http://www.cnblogs.com/dennisOne debug 和汇编编译器masm对指令的不同处理 debug masm debug 和编译器对[idata]有这不同的解释。 debug 将 "[idata]" 是一个内存单元, "idata" 是内存单元的偏移地址;而编译器将 "[idata]" 解释为 "idata" 。 解决之道 可以使用两种方式解决: (1). 指定段地址 mov al,ds:[0] 含义: (al)=((ds)*16+0) ,将内存单元中的数据送入 al 中; mov al,ds:[bx] 含义: (al)=((ds)*16+(bx)) ,将内存单元中的数据送入 al 中。 (2). 使用 [bx] mov al,[bx] 含义:同 "mov al, ds:[bx]" 相同。 loop 指令 指令格式: loop 标号 CPU 在执行 loop 指令要进行两步操作: (1). (cx) = (cx)-1 (2). 判断 cx 中的值,不为零则转至标号处执行程序,如果为 0 则向下执行。 loop 指令的基本结构 计算: 2^12 1 assume cs:code 2 code segment 3 start: mov ax, 2 4 mov cx, 11 5 s: add ax, ax 6 loop s 7 8

汇编语言常见的错误

喜你入骨 提交于 2019-12-18 08:09:59
一些常见的错误描述 错误编号 错误描述 0 Block nesting error 嵌套出错.嵌套的过程,段,结构,宏指令或重复块等非正常结束.例如在嵌套语句中有外层的结束语句,而无 内层的结束语局 1 Extra characters on line 一语句行有多余字符,可能是语句中给出的参数太多 2 Internal error-Register already defined 这是一个内部错误.如出现该错误,请记下发生错误的条件,并使用Product Assistance Request 表与 Microsoft公司联系 3 Unkown type specifer 未知的类型说明符.例如类型字符拼错,把BYTE写成BIT,NEAR写成NAER等 4 Redefinition of symbol 符号重定义.同一标识符在两个位置上定义.在汇编第一遍扫描时,在这个标识符的第二个定义位置上给出 这个错误 5 Symbol is multidefined 符号多重定义.同一标识符在两个位置上定义.在汇编第二遍扫描时,每当遇到这个标识符都给出这个错误 6 Phase error between passes 两次扫描间的遍错.一个标号在二次扫描时得到不同的地址值,就会给出这种错误.若在启动MASM时使用/D 任选项,产生第一遍扫描的列表文件,它可帮助你查找这种错误 7 Already

汇编语言程序设计学习笔记(第一遍学习)-第1节:机器语言编程到汇编语言的产生

柔情痞子 提交于 2019-12-18 08:09:39
  大家好!今天是我学习汇编语言的第一课。我感觉汇编好好玩啊! 机器码编程   哇! 一上来就写程序了啊,还是用机器码的啊!是呢!嘿嘿!我们去下载1个二进制编辑器,我也不知道哪款好用点,我下载的是FlexHEX。然后我们打开它,并写入一下代码:CD 00 以前我学C语言的时候,我知道CD 00 其实就是1100 1101 0000 0000啦!然后我们保存它为1个文件。关于文件名随便取啦!然后我们运行打开cmd,我们把刚才编辑保存好的文件拖到cmd中然后再运行! 哇!程序输出了Divide overflow 好棒啊!一上来就可以机器码编程啦!而且只有2字节呀!看起来也不是那么的复杂啊!但是我看下面的程序,下面的程序是welcome to masm的机器码: 大家看到了吗?!好多的01011001啊,要是我们写二进制机器码的时候1个被错误的写成0了,那如何去调试查找啊,所以汇编语言产生了哦!汇编语言它的主题是汇编指令,汇编指令呢只是机器指令便于书写记忆的一种格式。比如:机器指令1000100111011000 它的意思是寄存器BX的内容送到AX中,对于的汇编指令是:MOV AX,BX。大家看,这样的写法是不是更接近人类语言呀!(咦!什么是寄存器啊,这里怎么冒出来个寄存器,寄存器是CPU中可以存储数据的器件,一个CPU中有多个寄存器,AX,BX就是其中2个寄存器的代号)

计算机组成原理复习

旧时模样 提交于 2019-12-17 19:12:30
title: 计算机组成原理复习 date: 2018-06-28 14:08:04 tags: 课程学习 1.计算机硬件包括:输入设备,输出设备,运算器,控制器,存储器 2.计算机软件一般分为两大类:一类应用软件,另一类叫系统软件,操作系统属于系统软件类 3.第一代计算机的逻辑部件采用的是电子管,1946-1957年; 第二代计算机的逻辑部件采用的是晶体管,1958-1964年; 第三代计算机的逻辑部件采用的是中小规模集成电路,1965-1971年; 第四代计算机的逻辑部件采用的是大规模及超大规模集成电路,1972至今 4.计算机系统由硬件系统和软件系统构成。 5.计算机系统的三个层次结构由内到外分别是硬件系统,软件系统和应用软件 6.用高级语言编写的程序称为源 程序,经编译程序或解释程序翻译后称为 目标程序 7.将源程序翻译成目标程序的软件是编译器或编译程序 8.程序设计语言一般分为3类:机器语言,汇编语言,高级语言 9.编译方式是使用编译程序把源程序编译成机器代码的 目标程序 ,并以机器程序 的形式保留 10.简要说明计算机系统的层次结构? 计算机系统具有层次性,它由多级层次结构组成。从功能上计算机系统可分为五个层次级别: 第一级是微程序设计级。这是一个硬件级,它由机器硬件直接执行微指令。 第二级是一般机器级,也称为机器语言级。它由微程序解释机器指令系统.这一级是硬件级。

计算机导论课后总结-5

匆匆过客 提交于 2019-12-17 06:00:56
第四章 程序设计语言 程序设计语言简介 定义:程序设计语言是一组用来定义计算机程序的语法规则。 三个元素:语法、语义和语用 语法:用字符组合合成语法的规则集合 语义:一条合法语句的含义 语用:涉及语言使用者各方面的内容 程序设计语言的基本成分:数据成分、运算成分、控制成分、传输成分 程序设计语言的分类及编程模式 分类 机器语言:二进制代码表示的能直结识别的机器指令的集合。 指令包括操作码域和地址域两部分。根据地址域所涉及的地址数量,常见的指令格式有以下几种。 ①三地址指令:一般地址域中A1、A2分别确定第一、第二操作数地址,A3确定结果地址。下一条指令的地址通常由程序计数器按顺序给出。 ②二地址指令:地址域中A1确定第一操作数地址,A2同时确定第二操作数地址和结果地址。 ③单地址指令:地址域中A 确定第一操作数地址。固定使用某个寄存器存放第二操作数和操作结果。因而在指令中隐含了它们的地址。 ④零地址指令:在堆栈型计算机中,操作数一般存放在下推堆栈顶的两个单元中,结果又放入栈顶,地址均被隐含,因而大多数指令只有操作码而没有地址域。 ⑤可变地址数指令:地址域所涉及的地址的数量随操作定义而改变。如有的计算机的指令中的地址数可少至 0个,多至6个。 汇编语言:采用助记符来编写程序,是机器语言的符号化。 机器指令: 1000100111011000 汇编指令: MOV AX, BX

ARM汇编基础

北城以北 提交于 2019-12-17 04:53:18
1.  user模式不能切换到其他模式,其他特权模式可以切换到user模式。 2,  I=1,禁止IRQ, F=1,禁止FIQ。芯片启动时默认禁止这两位。 3.  N位:计算结果为负数时置1;  Z位:计算结果为0时置为1;      C位:a.加法进位时置1 b.减法产生借位时置为0;  V位:符号位改变时置1(针对有符号位) 4.  spsr:对cpsr进行备份, 不能在User 和system模式下使用。 5.  7类异常源:(1)FIQ(响应速度比IRQ快)  (2)IRQ[!!]  (3)data abort(数据终止)  (4)prefetch abort(指令预取终止)    (5)software interrupt[!!](例如用户态切换到内核态)  (6)undefined instruction(指令为定义异常)  (7)reset(复位) 6.  异常处理(自动处理)   (1)cpsr拷贝到spsr_<mode>   (2)设置cpsr     a)切换到ARM状态     b)进入到响应的异常模式。     c)禁止相应异常   (3)保存返回地址到LR_<mode>   (4)修改PC(在对应的异常向量表中查询)   返回(手动)   (1)从SPSR_<mode>恢复CPSR   (2)从LR_<mode>恢复PC; 7.  cotex-A

《30天自制操作系统》笔记(12)——多任务入门

大兔子大兔子 提交于 2019-12-16 23:42:14
《30天自制操作系统》笔记(12)——多任务入门 进度回顾 上一篇 介绍了设置显示器高分辨率的方法。本篇讲一下操作系统实现多任务的方法。 什么是多任务 对程序员来说,也许这是废话,不过还是说清楚比较好。 多任务就是让电脑 同时 运行多个程序(如一边写代码一边听音乐一边下载电影)。 电脑的CPU只有固定有限的那么一个或几个, 不可能 真的同时运行多个程序。所以就用近似的方式,让多个程序 轮换 着运行。当轮换速度够快(0.01秒),给人的 感觉 就是"同时"运行了。 多任务之不实用版 我们首先从最基本的想法开始,做一个不实用版的多任务作为例子。在学习这个例子的过程中引入真正的多任务必须的TSS、TR、far模式JMP的概念,为后续内容打基础。 当你向CPU发出任务切换的指令时,CPU会先把寄存器中的值全部 写入 内存某处;然后,从内存另一位置把所有寄存器的值 读取 出来。这就完成了一次任务切换。 任务切换消耗的时间就是读写内存消耗的时间,大概为 0.0001秒 。 任务状态段TSS 存取全部寄存器的值这件事,当然需要有一个数据结构,这就是 "任务状态段" (Task Status Segment)简称TSS。 1 struct TSS32 2 { 3 int backlink, esp0, ss0, esp1, ss1, esp2, ss2, cr3; 4 int eip,

【汇编指令】一些基础的汇编指令

风流意气都作罢 提交于 2019-12-16 11:08:28
文章目录 汇编 ARM的六大类指令集---LDR、LDRB、LDRH、STR、STRB、STRH LDR指令LDR指令的格式为: LDRB指令 LDRH指令 LDM指令: STR指令STR指令的格式为: STRB指令STRB指令的格式为: STRH指令STRH指令的格式为: STM指令: - MOV[move] 伪指令 sub减法 add加法 - B:跳转 BL:branch and link ldm 读内存,写入多个寄存器 stm 把多个寄存器的值写入内存 汇编 ARM的六大类指令集—LDR、LDRB、LDRH、STR、STRB、STRH — LDR 字数据加载指令— LDRB 字节数据加载指令— LDRH 半字数据加载指令— STR 字数据存储指令— STRB 字节数据存储指令— STRH 半字数据存储指令 LDR指令LDR指令的格式为: LDR{条件} 目的寄存器,<存储器地址> LDR指令用于从存储器中将一个32位的字数据传送到目的寄存器中。该指令通常用于从存储器中读取32位的字数据到通用寄存器,然后对数据进行处理。当程序计数器PC作为目的寄存器时,指令从存储器中读取的字数据被当作目的地址,从而可以实现程序流程的跳转。 指令示例: LDR R0,[R1]; 将存储器地址为R1的字数据读入寄存器R0。 LDR R0,[R1,R2] ; 将存储器地址为R1

学习:数学指令

北城以北 提交于 2019-12-15 19:47:48
add指令:加 之前测试的时候用的都是 add eax,0x1 ,其实add不仅可以给寄存器的地址加值 add eax,0x1 ,还可以给取地址的值加值 add dword ptr ds:[0x402000],0x2 ,也同样可以寄存器给寄存器加值 add eax,ecx ,如下图值为4的原因是自己原本就给了2,为什么是第一个为4呢,因为是倒着来的,实际值应该是00000004 sub指令:减 跟上面一样,同样可以进行给寄存器的地址减值 sub eax,0x1 ,还可以给取地址的值加值 sub dword ptr ds:[0x402000],0x2 ,也同样可以寄存器给寄存器加值 sub eax,ecx ,如下图原本值为4减2了,就自然是2了 adc指令:加的时候需要考虑上进位标志CF 1、修改当前地址的汇编指令为 adc eax,0x1 2、单步步过 发现eax中的地址值加1 3、把C寄存器置为1 4、修改汇编指令 adc eax,0x1 5、单步步过 发现eax的地址值为3,也就是说加了2,所以adc指定加的时候需要考虑上进位标志CF sbb指令:减的时候需要考虑上进位标志CF 1、修改当前地址的汇编指令为 sbb eax,0x1 2、单步步过 发现eax中的地址值减1,eax的地址值为2 3、把C寄存器置为1 4、修改汇编指令 sbb eax,0x1 5、单步步过