ASM16-16~18 --BCD码调整指令和控制类转移指令
ASM16BCD码加、减调整指令BCD调整指令主要有四种(乘法和除法的不做要求):DAA压缩型BCD数加法调整指令AAA非圧缩型BCD数加法调整指令
DAS压缩型BCD数减法调整指令AAS非圧缩型BCD数减法调整指令
123456789101112131415161718192021(ADD AL,i8/r8/m8)(ADC AL,i8/r8/m8)AAA; AL<-将AL的加和调整为非压缩码BCD码; AH<-AH+调整的进位(SUB AL,i8/r8/m8)(SBB AL,i8/r8/m8)AAS; AL<-将AL的减差调整为非压缩BCD码;AH<-AH - 调整的借位(ADD AL,i8/r8/m8)(ADC AL,i8/r8/m8)DAA; AL<-将AL的加和调整为压缩BCD码 (SUB AL,i8/r8/m8) (SBB AL,i8/r8/m8) DAS ; AL<-将AL的减差调整为压缩BCD码
使用AAA或AAS指令前,应先执行以AL为目的操作数的加法或减法指令
AAA和AAS指令在调整中产生了进位或错位,则AH要加上进位或 ...
ASM16-14 --算术运算类指令
ASM16算术运算类指令
四则运算是计算机经常进行的一种操作。算术运算指令实现二进制(和十进制)数据的四则运算
请注意算术运算类指令对标志的影响
掌握:ADD/ADC/INC、SUB/SBB/DEC/NEG/CMP
熟悉:MUL/IMUL、DIV/IDIV
理解:CBW/CWD、DAA/DAS、AAA/AAS/AAM/AAD
加法指令ADD
ADD指令将源与目的操作数相加,结果送到目的操作数
ADD指令按状态标志的定义相应设置
12345678ADD reg,imm/reg/mem ; reg<-reg+imm/reg/memADD mem,imm/reg ; mem<-mem+imm/reg mov ax,1mov bx,2add ax,bx
带进位加法指令ADC
ADC指令将源与目的操作数相加,再加上进位CF标志结果送到目的操作数
ADC指令按状态标志的定义相应设置
ADC指令主要与ADD配合,实现多精度加 ...
ASM16-13 --数据传送类指令
ASM16数据传送类指令
数据传送是计算机中最基本、最重要的一种操作
传送指令也是最常使用的一类指令
传送指令把数据从一个位置传送到另一个位置
除标志寄存器传送指令外,均不影响标志位
重点掌握 MOV XCHG XLAT PUSH POP LEA
通用数据传送指令
提供方便灵活的通用传送操作
有3条指令 MOV XCHG XLAT
传送指令MOV
把一个字节或字的操作数从源地址传送至目的地址
1234MOV reg/mem,imm ;立即数送寄存器或主存MOV reg/mem/seg,reg ;寄存器送(段)寄存器或主存MOV reg/seg,mem ;主存送(段)寄存器MOV reg/mem,seg ;段寄存器送寄存器或主存
非法传送
两个操作数的类型不一致
例如源操作数是字节,而目的操作数是字;或相反
两个操作数不能都是存储器
传送指令很灵活,但主存之间的直接传送却不允许
段寄存器的操作有一些限制
段寄存器属专用寄存器,对他们的操作能力有限
两个操作数的类型要一致
绝大多数双操作数指令,除非特别说明,目的操作数与源操作数必须一致,否则为非法指令
1MOV ...
ASM16-12 --键盘输入并回显
ASM16键盘输入并回显把01传给AH,则可以实现键盘输入并回显,如果输入成功则AL为输入的字符
12345678910111213141516171819202122232425262728MyStack segment stack ;stack表明是堆栈段,则之后系统给地址会从大到小,而且系统会自动把该段的基址送入ss寄存器 db 256 dup(?)MyStack endsMyData segment ;数据段 db 03,04,05,06 string db "Hello World$"MyData endsMyCode segment ;代码段start: ;告诉编译器代码从此处开始 mov ax,MyData ;获取段基址 mov ds,ax ;将段基址送入寄存器 mov es,ax ;键盘输入并回显 mov ah,01 int 21h mov dx,o ...
ASM16-11 --hello world(asm)
ASM16创建一个hello world的程序
123456789101112131415161718192021222324MyStack segment stack ;stack表明是堆栈段,则之后系统给地址会从大到小,而且系统会自动把该段的基址送入ss寄存器 db 256 dup(?)MyStack endsMyData segment ;数据段 db 03,04,05,06 string db "Hello World!$"MyData endsMyCode segment ;代码段start: ;告诉编译器代码从此处开始 mov ax,MyData ;获取段基址 mov ds,ax ;将段基址送入寄存器 mov es,ax mov dx,offset string ;==>mov dx,word ptr[0]==>mov dx,0 ;获取hello world ...
ASM16-8~10 --寻址方式
ASM16x86指令编码(硬编码)的结构
opcode最少1个字节,最多3个字节。
opcode是指令中最重要的组成部分。
前缀指令只能影响自己,而opcode、ModR/M、SIB决定了整条指令的长度。
有没有ModR/M是由opcode决定的,有没有SIB是由ModR/M决定的。
指令长度:
变长指令 复杂指令集 (intel amd):仅仅通过opcode是没有办法确定长度的。
定长指令 精简指令集 (arm):它的长度永远没有变化,只要opcode的长度确定了,那么它的长度就确定了。
精简指令集:
这种 CPU 的设计中,微指令集较为精简,每个指令的运行时间都很短,完成的动作也很单纯,指令的执行效能较佳; 但是若要做复杂的事情,就要由多个指令来完成。
复杂指令集:
与精简指令集不同的,CISC复杂指令集在微指令集的每个小指令可以执行一些较低阶的硬件操作,指令数目多而且复杂, 每条指令的长度并不相同。因为指令执行较为复杂所以每条指令花费的时间较长, 但每条个别指令可以处理的工作较为丰富。
比较:
CPU架构
特性 ...
ASM16-7 --存储器组织与段寄存器
ASM16存储器组织与段寄存器
寄存器是微处理器内部暂存数据的存储单元,以名称表示
存储器则是微处理器外部存放程序及其数据的空间
程序及其数据可以长久存放在外存,在程序需要时才进入主存
主存需要利用地址区别
数据信息的表达单位
计算机中信息的单位
二进制位Bit:存储一位二进制数:0或1
字节Byte:8个二进制位,D7~D0
字Word:16位,2个字节,D15~D0
双字DWord:32位,4个字节,D31~D0
最低有效位LSB:数据的最低位,D0位
最高有效位MSB:数据的最高位,对应字节、字、双字分别指D7、D15、D31位
存储单位及其存储内容
每个存储单元都有一个编号,被称为存储器地址
每个存储单位存放一个字节的内容
多字节数据存放方式
多字节数据在存储器中占连续的多个存储单元:
存放时,低字节存入低地址,高字节存入高地址;
表达时,用它的低地址表示多字节数据占据的地址空间。
80x86处理器采用“低对低、高对高”的存储形式,被称为“小端方式Little Endian”
相对应还存在“大端方式Big Endian”
数据的地址对齐
...
ASM16-5、6 --标志寄存器
ASM16高低位:
AX为16位寄存器,AH和AL分别为AX的高八位和低八位
AX=AH+AL
低8位寄存器位AL、BL、CL和DL,高8位为AH、BH、CH和DH,它们只能用来存放8位数据,不能用来存放地址信息
而SP、BP等用于存放地址没有高低位之分
标志寄存器
标志(Flag)用于反映指令执行结果或控制指令执行性形式
8086处理器的各种标志形成了一个16位的标志寄存器FLAGS(程序状态字PSW寄存器)
标志的分类
状态标志——用来记录程序运行结果的状态信息,许多指令的执行都将相应地设置它 CF ZF SF PF OF AF
控制标志——可由程序根据需要用指令设置,用于控制处理器执行指令的方式 DF IF TF
状态标志:
进位标志CF(Carry Flag)
如果运算结果的最高位产生了一个进位或错位,那么,其值为1,否则其值为0
奇偶标志PF(Parity Flag)
由于反应运算结果中(转化为二进制),”1”的奇偶性,也就是个数。”1”的个数为偶数,PF为1。个数为奇数,PF为0.补充:只包含最低位的一个字节(二进制的后八位)
辅助 ...
ASM16-3、4 --ALU和寄存器
ASM16ALU 算数逻辑单元命名:算术逻辑单元(Arithmetic&Logic Unit),简称ALU组成:ALU有2个单元,算术单元(Arithmetic Unit)和逻辑单元(Logic Unit),算术单元负责计算机里的所有数字操作作用:计算机中负责运算的组件,处理数字/逻辑的最基本单元
功能:
算术操作:加法、减法、乘法、除法等。
逻辑操作:AND、OR、NOT、XOR、比较等。
数据转换:如浮点数与整数之间的转换。
cpu内部的算数操作都可以是加法(所谓的加法、减法、乘法、除法指令)
减法:通过反码的方式来将减法转换成加法运算,通过补码的方式消除了+0和-0的歧义。而在减法的运算结果中,还需要对结果进行补码。
乘法:计算机乘法是移位和累加实现的,每位的数字代表需要移动几位
除法:计算机除法的实现是移位和累减,首先对齐除数和被除数,对齐后相减,如果结果大于等于0,则记录商1;如果结果小于0,则记录商0之后右移,结果作为下次运算的被除数,并将商左移循环这个过程,直到除数移回原位,并记录余数
什么是指令系统
计算机的指令系统就是指该计算机能够执行的全部指 ...
ASM16-1、2 --汇编语言基础知识
ASM16汇编语言基础知识什么是汇编语言
汇编语言的主要特点:
汇编语言程序与处理器指令系统密切相关
程序员可直接、有效地控制系统硬件
形成的可执行文件运行速度快、占用主存容量少
由于机器码的复杂(0001 0010 0011 0100 ….)使用助记符来辅助
汇编语言助记符是用于表示汇编指令的简短符号。它们是由程序员选择的,用以代替机器语言中复杂的二进制指令码。这些助记符使代码更加容易理解和记忆,同时便于汇编器将其翻译成机器语言。
汇编语言的种类:
汇编语言和CPU息息相关,但是不能把汇编语言完全等同于CPU的机器指令。不同架构的CPU指令并不相同,如x86,powerpc,arm各有各的指令系统;甚至同一种架构的CPU有几套指令集,典型的如arm除了有32位的指令集外,还有一套16位的thumb指令集。但是作为开发语言的汇编,本质上是一套语法规则和助记符的集合,它可以包容不同的指令集。如果从CPU体系来划分,常见的汇编有两种:IBM PC汇编和ARM汇编。
汇编语言和高级语言
汇编语言与处理器密切相关:
汇编语言程序的通用性、可移植性较差
高级语言与具体计算 ...