汇编语言学习之基本指令(上)
汇编语言学习之基本指令(上)
汇编语言对大小写不敏感,所以笔者全部采用大写说明语法规则,实例中采用小写英文
文章目录
- 汇编语言学习之基本指令(上)
- 1.数据传送类指令
- 1.1传送指令MOV
- 1.2交换指令XCHG
- 1.3换码指令XLAT
- 2.堆栈操作指令
- 2.1进栈指令PUSH
- 2.2出栈指令POP
- 3.标志操作指令
- 3.1标志寄存器FLAGS的介绍
- 3.2相关指令
- 4.地址传送指令LEA
- 5.算术运算类指令
- 5.1加法和减法指令
- 5.2 符号扩展指令
- 5.3 乘法和除法指令
1.数据传送类指令
1.1传送指令MOV
MOV REG/MEM, IMM ;立即数送往寄存器或主存
MOV REG/MEM/SEG,REG ;寄存器送寄存器(包括段寄存器)或主存
MOV REG/SEG,MEM ;主存送往寄存器(包括段寄存器)
MOV REG/MEM,SEG ;段寄存器送主存或寄存器
例子:
mov cl, 4 ;CL<-4, 字节传送
mov dx, 0ffh ;DX<-00FFH, 字传送
mov si, 200h ;SI<-0200H, 字传送
mov ah, al ;AH<-AL
mov bvar,ch ;bvar是一个字节变量
mov al,table[bx] ;table指向一个数据表
mov dx,[bp+4] ;DX<-SS:[BP+4]
mov ax,ds ;AX<-DS
mov es,ax ;ES<-DS
注意:
- 目的操作数和源操作数必须类型一致,或者同为字,或者同为字节,否则为非法指令
- 寄存器有明确的字节或字类型,对应的立即数或存储器操作数只能是字节或字;但将立即数传送给存储器单元时,指令中给出的立即数可以理解为字,也可以理解为字节,此处必须显示指出。
mov [BX+SI],255 ;非法指令,无法确定[BX+SI]指向的存储单元是字节还是字单元
mov byte ptr [bx+si], 255 ;正确:byte ptr说明是字节操作
mov word ptr [si+1],255 ;正确:word ptr说明是字操作
- 8086/8088指令系统除操作类指令外,不允许两个操作数都是存储单元,所以也就没有主存到主存之间的数据传送指令。要实现这种传送,可以通过寄存器间接实现。
mov buf2,buf1 ;非法指令:不能实现存储单元之间的直接传送
mov ax,buf1 ;正确:AX<-buf1(将buf1内容送AX)
mov buf2,ax ;正确:buf2<-AX
- 在8086/8088指令系统中,能直接对段寄存器的操作只有MOV等个别传送指令,且不灵活,所以采用段寄存器要特别注意:
mov ds,es ;非法指令:不允许段寄存器之间的直接传送
mov ax,es ;正确:借助AX寄存器实现段寄存器之间的直接传送
mov ds,ax ;
1.2交换指令XCHG
交换指令用来将源操作数与目的操作数内容交换,其格式为:
XCHG REG,REG/MEM ;REG<->REG/MEM
XCHG REG/MEM,REG ;REG/MEM<->REG
- XCHG指令操作数可以是字也可以是字节,可以在通用寄存器与通用寄存器或存储器之间交换数据,但不能在存储器与存储器之间交换数据。
1.3换码指令XLAT
换码指令常用于将一种代码转换为另一种代码,如键盘位置码装换为ASCII码,数字0~9装换为7段显示码等。使用前,首先在主存中建立一个字节表格,表格的内容是要装换成的目的代码,表格的首地址存放于BX寄存器,需要转换的代码存放于AL寄存器,要求被转换的代码应是相对表格首地址的偏移量。设置好后,执行换码指令,即将AL寄存器的内容转换为目的代码。
XLAT指令默认的缓冲区在数据段DS,但可以进行段超越。
XLAT TABLE ;AL<-[BX+AL]
例子:将首地址为400H的表格中的3号数据(假设为46H)取出
mov bx, 400h ;BX<-400H
mov al, 03h ;AL<-03H
xlat ;AL<-46H
- XLAT指令中没有显示指明操作数,而是默认使用BX和AL寄存器。这种采用默认操作数的方法称为隐含寻址方式。
2.堆栈操作指令
堆栈是一个“先进后出”的主存区域,使用SS段寄存器记录段地址;堆栈只有一个出口,即当前栈顶,用堆栈指针寄存器SP指定栈顶的偏移地址。
2.1进栈指令PUSH
push r16/m16/seg ;SP<-SP-2, SS:[SP]<-R16/M16/SEG
- 进栈指令PUSH先使堆栈指针SP减2,然后把一个字操作数存入堆栈顶部
2.2出栈指令POP
pop r16/m16/seg ;R16/M16/SEG<-SS:[SP], SP<-SP+2
- 出栈指令POP把栈顶的一个字传送至指定目的操作数,然后堆栈指针SP+2
例子:
mov ax, 7812h
push ax ;将AX内容推入栈顶
pop ax ;将当前栈顶内容弹给AX
push [2000h] ;将内存DS:[2000H]内容推入栈顶
pop wvar ;将当前栈顶内容弹给自变量wvar
3.标志操作指令
3.1标志寄存器FLAGS的介绍
8086一共9种标志寄存器
- CF——当加减运算结果的最高有效位有进位(加法)或借位(减法)时,进位标志置1
- ZF——若运算结果为0,则ZF置1;否则置0
- SF——运算结果的最高有效位就是符号标志的状态。即运算结果最高位置1,则SP=1,否则SP=0
- PF——当运算结果最低字节中“1”的个数是偶数或0时,PF=1;否则为0
- OF——若算术运算的结果有溢出,则OF=1,否则OF=0
- AF——若运算时D3位(低半字节)有进位或借位,则AF=1,否则AF=0;
3.2相关指令
CLC ;复位CF: CF<-0
STC ;置位CF: CF<-1
CMC ;求反CF: CF<-~CF
CLD ;复位DF: DF<-0
STD ;置位DF: DF<-1
CLI ;复位IF: IF<-0
STI ;置位IF: IF<-1
4.地址传送指令LEA
LEN指令将存储器操作数的有效地址(段内偏移地址)传送至16位通用寄存器中。
LEA R16,MEM ;R16<- MEM的有效地址EA
例子:
mov bx,400h
mov si,3ch
lea bx, [bx+si+of62h] ;bx=139eh
5.算术运算类指令
5.1加法和减法指令
加法指令包括ADD、ADC和INC,减法指令包括SUB、SBB、DEC、NEG和CMP。它们分别执行字或字节的加法和减法运算,除INC和DEC不影响CF标志外,其他按定义影响全部状态标志位。
[注意:]采用双操作数的加法、减法和后面介绍的逻辑运算指令具有共同的也是8088主要的操作数组合形式:
运算指令助记符 reg,imm/reg/mem
运算指令助记符 mem,imm/reg
加和减指令
ADD DEST, SRC ; 加法:DEST<-DEST+SRC
SUB DEST, SRC ; 减法:DEST<-DEST-SRC
例子:
mov ax,7348h ;AX=7348H
add al,27h ;AX=736FH,OF=0,SF=0,ZF=0,PF=1,CP=0
add ax,3fffh ;AX=B36EH,OF=1,SF=1,ZF=0,PF=0,CF=0
sub ah,0f0h ;AX=C36EH,OF=0,SF=1,ZF=0,PF=1,CF=1
mov word ptr[200h], 0ef00h ;[200H]=EF00H,OF=0,SF=1,ZF=0,PF=1,CF=1
sub [200h], ax ;[200H]=2B92H,OF=0,SF=0,ZF=0,PF=0,CF=0
sub si,si ;SI=0,OF=0,SF=0,ZF=1,PF=1,CF=0
带进位加和减指令
ADC DEST,SRC ;加法:DEST<-DEST+SRC+CF
SUB DEST,SRC ;减法:DEST<-DEST-SRC-CF
比较指令CMP
CMP DEST,SRC ;做减法运算DEST-SRC
;比较指令通过减法运算影响状态标志,用于比较两个操作数的大小
增量减量指令
INC REG/MEM ;加1:REG/MEM<-REG/MEM+1
DEC REG/MEM ;减1:REG/MEM<-REG/MEM-1
求补指令
NEG REG/MEM ;REG/MEM<-0-REG/MEM
5.2 符号扩展指令
符号扩展是指用一个操作数的符号位(即最高位)形成了另一个操作数,后一个操作数的高位是全0(正数)或全1(负数)。符号扩展虽然使数据位数加长,但数据的大小并没有改变,扩展的高位部分仅是低部分的符号扩展。
- 符号扩展指令有两条,用来将字节转换为字,字转换为双字。它们均不影响标志位。
CBW ;字节装换为字,AL符号扩展成AX
CWD ;字转换为双字,AX符号扩展为DX
5.3 乘法和除法指令
乘法和除法指令分别为实现两个二进制操作数的相乘和相除运算,并针对无符号整数和有符号整数设计了不同的指令。
乘法指令
MUL R8/M8 ;无符号字节乘法:AX<-AL*R8/M8
MUL R16/M16 ;无符号字乘法:DX.AX<-AX*R16/M16
IMUL R8/M8 ;有符号字节乘法:AX<-AL*R8/M8
IMUL R16/M16 ;有符号字乘法:DX.AX<-AX*R16/M16
乘法指令按照如下规则影响标志OF和CF。若乘积的高一半是低一半的符号扩展,则OF=CF=0(说明高一半不是有效值);否则均为1(说明高一半含有有效数值)。乘法指令对其他状态标志没有定义,也就是可以任意。
汇编语言学习之基本指令(上)相关推荐
- 通过电脑给继电器发送指令_三菱FX PLC学习之通信指令(上)
点击上方蓝字关注我们 [免费抽奖]电气人不能错过的PLC书籍与软件! 通信指令本身不难,难的是对通信的理解.在学习PLC通信指令之前,我曾尝试去看通信相关的课程,然后告诉自己:算了,不必勉强自己,学不 ...
- LOOP指令——汇编语言学习笔记3
因为嵌入式系统学习需要,开始学习汇编语言 学习资料是B站的视频:汇编语言程序设计 贺利坚主讲 (P25) 这里写目录标题 一.LOOP功能与格式 二.LOOP指令实例 三.LOOP指令执行的要求 四. ...
- AM335X的汇编语言与c语言,X86汇编语言学习手记 -- 汇编和C协同
X86汇编语言学习手记(3) 2004年12月 在X86汇编语言学习手记(1)(2)中,可以看到栈(Stack)作为进程执行过程中数据的临时存储区域,通常包含如下几类数据: 局部变量 函数调用的返回地 ...
- X86汇编语言学习手记(1)
X86汇编语言学习手记(1) 作者: Badcoffee Email: blog.oliver@gmail.com 2004年10月 原文出处: http://blog.csdn.net/yayong ...
- windows下32位汇编语言学习笔记
windows下32位汇编语言学习笔记 第一章 第一章 背景知识 80x86处理器的存储器 4个数据寄存器 EAX,EBX,ECX,EDX EAX寄存器 所有API函数的返回值都保存在EAX里,注意 ...
- win32汇编语言学习笔记(三)
汇编语言学习笔记(三) CH3.Windows汇编基础 .386 .model flat,stdcall option casemap:none 定义程序使用的指令集.工作模式 相应的还有:.8086 ...
- 菜鸟的汇编语言学习笔记
汇编语言学习笔记 1.1机器语言 计算机发展初期,人们都是用机器语言进行编程的,这也是人们能实现编程控制计算机的最低级别.那么机器语言是什么样子的呢?就是用0和1组成的一个串(形如011010101) ...
- Git学习系列之Windows上安装Git之后的一些配置(图文详解)
不多说,直接上干货! 前面博客 Git学习系列之Windows上安装Git详细步骤(图文详解) 第一次使用Git时,需要对Git进行一些配置,以方便使用Git. 不过,这种配置工作只需要进行一次便可, ...
- linux平台学x86汇编语言学习集合帖
linux平台学x86汇编语言学习集合帖 linux平台学x86汇编(一):https://blog.csdn.net/shallnet/article/details/45543237 linux平 ...
最新文章
- spring之旅第四篇-注解配置详解
- Selenium3自动化测试——10.为百度搜索设置弹窗
- redis 集合操作
- Google首席科学家谈Google是怎么做深度学习的
- python数字图像处理(17):边缘与轮廓
- oracle方差和协方差函数,[转载]方差var、协方差cov、协方差矩阵(浅谈)(三)_函数cov...
- innodb_flush_log_at_trx_commit
- Intel INDE(集成原生开发人员体验)的Windows开发指导
- 怎么恢复php格式关联,SCN与数据恢复关联
- 前端必须要有的学习能力
- 从文本界面安装RHEL5操作系统详解
- oracle 导入性能,EXP,EXPDP数据导入本地性能测试的一点心得
- 通信基础 8 —— MIMO / 3GPP / UMI
- 边缘检测-HED-RCF
- 互联网思维笔记(一)
- 实战游戏项目管理1-规划篇
- 6月最新兼容15.0系统ipa重签名工具(win+mac)免费
- 最新html取消dynsrc属性无效,Html属性标签 - osc_5aj0jo70的个人空间 - OSCHINA - 中文开源技术交流社区...
- MultiCD: 构建多重引导 CD 映像
- python-tkinter(7) 实现各种个样的撩妹鼠标拖尾