汇编语言学习之基本指令(上)

汇编语言对大小写不敏感,所以笔者全部采用大写说明语法规则,实例中采用小写英文

文章目录

  • 汇编语言学习之基本指令(上)
    • 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(说明高一半含有有效数值)。乘法指令对其他状态标志没有定义,也就是可以任意。

汇编语言学习之基本指令(上)相关推荐

  1. 通过电脑给继电器发送指令_三菱FX PLC学习之通信指令(上)

    点击上方蓝字关注我们 [免费抽奖]电气人不能错过的PLC书籍与软件! 通信指令本身不难,难的是对通信的理解.在学习PLC通信指令之前,我曾尝试去看通信相关的课程,然后告诉自己:算了,不必勉强自己,学不 ...

  2. LOOP指令——汇编语言学习笔记3

    因为嵌入式系统学习需要,开始学习汇编语言 学习资料是B站的视频:汇编语言程序设计 贺利坚主讲 (P25) 这里写目录标题 一.LOOP功能与格式 二.LOOP指令实例 三.LOOP指令执行的要求 四. ...

  3. AM335X的汇编语言与c语言,X86汇编语言学习手记 -- 汇编和C协同

    X86汇编语言学习手记(3) 2004年12月 在X86汇编语言学习手记(1)(2)中,可以看到栈(Stack)作为进程执行过程中数据的临时存储区域,通常包含如下几类数据: 局部变量 函数调用的返回地 ...

  4. X86汇编语言学习手记(1)

    X86汇编语言学习手记(1) 作者: Badcoffee Email: blog.oliver@gmail.com 2004年10月 原文出处: http://blog.csdn.net/yayong ...

  5. windows下32位汇编语言学习笔记

    windows下32位汇编语言学习笔记 第一章  第一章 背景知识 80x86处理器的存储器 4个数据寄存器 EAX,EBX,ECX,EDX EAX寄存器 所有API函数的返回值都保存在EAX里,注意 ...

  6. win32汇编语言学习笔记(三)

    汇编语言学习笔记(三) CH3.Windows汇编基础 .386 .model flat,stdcall option casemap:none 定义程序使用的指令集.工作模式 相应的还有:.8086 ...

  7. 菜鸟的汇编语言学习笔记

    汇编语言学习笔记 1.1机器语言 计算机发展初期,人们都是用机器语言进行编程的,这也是人们能实现编程控制计算机的最低级别.那么机器语言是什么样子的呢?就是用0和1组成的一个串(形如011010101) ...

  8. Git学习系列之Windows上安装Git之后的一些配置(图文详解)

    不多说,直接上干货! 前面博客 Git学习系列之Windows上安装Git详细步骤(图文详解) 第一次使用Git时,需要对Git进行一些配置,以方便使用Git. 不过,这种配置工作只需要进行一次便可, ...

  9. linux平台学x86汇编语言学习集合帖

    linux平台学x86汇编语言学习集合帖 linux平台学x86汇编(一):https://blog.csdn.net/shallnet/article/details/45543237 linux平 ...

最新文章

  1. spring之旅第四篇-注解配置详解
  2. Selenium3自动化测试——10.为百度搜索设置弹窗
  3. redis 集合操作
  4. Google首席科学家谈Google是怎么做深度学习的
  5. python数字图像处理(17):边缘与轮廓
  6. oracle方差和协方差函数,[转载]方差var、协方差cov、协方差矩阵(浅谈)(三)_函数cov...
  7. innodb_flush_log_at_trx_commit
  8. Intel INDE(集成原生开发人员体验)的Windows开发指导
  9. 怎么恢复php格式关联,SCN与数据恢复关联
  10. 前端必须要有的学习能力
  11. 从文本界面安装RHEL5操作系统详解
  12. oracle 导入性能,EXP,EXPDP数据导入本地性能测试的一点心得
  13. 通信基础 8 —— MIMO / 3GPP / UMI
  14. 边缘检测-HED-RCF
  15. 互联网思维笔记(一)
  16. 实战游戏项目管理1-规划篇
  17. 6月最新兼容15.0系统ipa重签名工具(win+mac)免费
  18. 最新html取消dynsrc属性无效,Html属性标签 - osc_5aj0jo70的个人空间 - OSCHINA - 中文开源技术交流社区...
  19. MultiCD: 构建多重引导 CD 映像
  20. python-tkinter(7) 实现各种个样的撩妹鼠标拖尾

热门文章

  1. 针对list集合的操作,按照某一字段,对另一个字段进行归类
  2. BUUCTF:[UTCTF2020]sstv
  3. 现代电子计算机音乐制作,现代电子音乐制作利器——Alesis VI61 MIDI键盘
  4. jquery php下拉列表,JQuery三级下拉菜单
  5. HashSet 集合
  6. 电脑更改开机密码和用户名
  7. pytorch Tensor及其基本操作
  8. python3 yield
  9. 设计,让交叉口更安全
  10. 说说越婢加术汤(黄煌)