草庐IT

汇编指令

liert 2023-03-28 原文

aaa/aas

aaa ; 将AL的加和调整为非压缩BCD码,AH=AH+调整的进位
aas ; 将AL的减差调整为非压缩BCD码,AH=AH+调整的借位

先执行以AL为目的操作数的加法或减法指令

add

add 目的,源 ; 加法指令,结果放入目操作数,操作数的长度必须相同

adc

adc 目的,源 ; 带进位加法,目的=目的+源+CF

主要与ADD配合,实现多精度加法运算

and

and 目的,源 ; 逻辑按位与 指令,结果放到目的操作数。
; 影响标志位OF、SF、ZF、PF和CF。

call

call s
; 使call s下一条指令的 CS:IP 入栈(段内转移只有 IP 入栈),跳转到标号处

cbw/cwd

cbw ; AL的符号扩展至AX
cwd ; AX的符号扩展至DX

clc/stc/cmc/cli/sti

clc ; 复位进位标志:CF=0
stc ; 置位进位标志:CF=1
cmc ; 求反进位标志:CF=~CF
cli ; 复位中断标志:DF=0
Sti ; 置位中断标志:DF=1

cmp

cmp des, sou ; des - sou 不改变 源/目的 的值

注:如果比较的是两个无符号数,则零标志位和进位标志位表示的两个操作数之间的关系如下表所示:

CMP结果 ZF CF
目的操作数 < 源操作数 0 1
目的操作数 > 源操作数 0 0
目的操作数 = 源操作数 1 0

注:如果比较的是两个有符号数,则符号标志位、零标志位和溢出标志位表示的两个操作数之间的关系如下表所示:

CMP结果 标志位
目的操作数 < 源操作数 SF ≠ OF
目的操作数 > 源操作数 SF=OF
目的操作数 = 源操作数 ZF=1

cmov

指令 同义名 条件 描述
cmovne cmovnz -ZF ZF不为0时,进行传送

daa/das

daa ; 将AL的加和调整为压缩BCD码
das ; 将AL的减差调整为压缩BCD码

应先执行以AL为目的操作数的加法或减法指令

div/idiv

div reg/mem ; 无符号除法指令
idiv reg/mem ; 有符号除法指令
; 除数为8位时,被除数存于AX,商存于AL,余数存于AH
; 除数为16位时,被除数存于DX.AX,商存于AX,余数存于DX

inc/dec

inc 目的 ; 加一(自增)指令。
dec 目的 ; 减一(自减)指令。

jmp

无条件跳转
jmp 标号
jmp short 标号 ; 段内短转移,位移范围(-128~127)
jmp near ptr 标号 ; 段内近转移,位移范围(-32768~32767)
jmp far ptr 标号 ; 段间转移
jmp word ptr 内存单元地址 ; 段内转移
jmp dword ptr 内存单元地址 ; 段间转移

jne、jnz

jne s ; 条件转移指令。当ZF = 0,转至标号处执行。
jnz s ; 条件转移指令。当ZF != 0,转至标号处执行。

条件跳转助记符

lahf/sahf

lahf ; 将EFLAGS寄存器的低字节复制到AH
sahf ; 将AH内容复制到EFLAGS(或RFLAGS)寄存器低字节

复制的标志位包括:符号标志位(SF)、零标志位(ZF)、辅助进位标志位(AF)、奇偶标志位(PF)、进位标志位(CF)

lds/les

lds reg, mem ; 将mem处的数据赋值给reg,mem+2处的数据复制给DS
les reg, mem ; 将mem处的数据赋值给reg,mem+2处的数据复制给ES

lea

lea 目的,源
; 取有效地址指令,获取的是源的内存单元的地址(偏移地址)不是数据
; 源操作数必须是存储器操作数(ds:[0123H])或者标号

loop

s:
add ax, ax
loop s ; cx寄存器不为0,则跳转到s;s标号
; 执行时,先(cx)=(cx)-1,再判断cx是否为0

mov

mov ax, 0 ; 把 0 复制到 ax
mov byte ptr xx:[x], 0 ; 8 位数传送 ptr – pointer (指针)缩写。
mov word ptr xx:[x], 0 ; 16 位数传送

两个操作数必须是同样的大小
两个操作数不能同时为内存操作数
指令指针寄存器(IP、EIP或RIP)不能作为目标操作数
标准格式:
mov reg,reg
mov mem,reg
mov reg,mem
mov mem,imm
mov reg,imm

movsx

movsx 16位寄存器, 8位寄存器
; 把8位寄存器的值复制给16位寄存器,前面用1填充

符号扩展并传送,只适用于有符号整数
标准格式:
movsx reg32,reg/mem8
movsx reg32,reg/mem16
movsx reg16,reg/mem8

movzx

movzx 16位寄存器, 8位寄存器
; 把8位寄存器的值复制给16位寄存器,前面用0填充

全零扩展并传送,只适用于无符号整数
标准格式:
movzx reg32,reg/mem8
movzx reg32,reg/mem16
movzx reg16,reg/mem8

mul/imul

乘法指令
mul 寄存器或内存单元 ; 无符号
imul 寄存器或内存单元 ; 有符号
; 两个相乘的数,位数必须是相同的,如果是8位其中一个默认在AL,结果存放在AX
; 如果是16位其中一个默认在AX,结果高位存放在DX,低位存放在AX

乘法指令影响OF和CF标志:
MUL指令——若乘积的高一半(AH或DX)为0,则OF=CF=0;否则OF=CF=1
IMUL指令——若乘积的高一半是低一半的符号扩展,则OF=CF=0;否则均为1
乘法指令对其他状态标志没有定义,即无法确定

neg

neg reg ; 求补指令,按位取反再+1
neg men

not

not 目的 ; 逻辑非 指令;结果放到目的操作数。
; 不影响标志位。

offset

mov ax,offset 标号 ; 取标号的偏移地址
; offset是操作符不是汇编指令,由编译器执行。

or

or 目的,源 ; 逻辑按位或 指令;结果放到目的操作数。
; 影响标志位OF、SF、ZF、PF和CF。

push/pop | pushf/popf

push ax ; 将ax寄存器的数据压入栈中,执行时,先SP - 2,随后写入数据,高位对高位,低位对低位.
pop ax ; 从栈中取出数据存入ax,执行时,先取出数据写入ax寄存器,随后SP + 2
pushf ; FLAGS标志寄存器入栈
popf  ; FLAGS标志寄存器出栈

*注:如果寄存器是32(64)位的则SP ± 4(8)。

ret/retf

ret 相当于 pop ip
retf 相当于 pop ip pop cs

sub

sub 目的,源 ; 减法指令,结果放入目操作数。

sbb

sbb 目的,源 ; 带借位减法,目的=目的-源-CF

主要与SUB配合,实现多精度减法运算

test

test ax, bx
; 将两个操作数进行 逻辑与 运算,并根据运算结果设置相关的标志位。
; 但是两个操作数不会被改变。运算结果在设置过相关标记位后会被丢弃。
; TEST AX,BX 与AND AX,BX命令有相同效果,只是Test指令不改变AX和BX的内容,
; 而AND指令会把结果保存到AX中。
; 影响标志:C,O,P,Z,S(其中C与O两个标志会被设为0)
Intel的技术手册
TEMP ← SRC1 AND SRC2;      // 逻辑与的结果赋值给TEMP
SF ← MSB(TEMP);            // 最高位赋值给 SF 标志位
IF TEMP = 0
THEN ZF ← 1;               // TEMP == 0  ZF 标志位设置1
ELSE ZF ← 0;               // TEMP != 0  ZF 标志位设置0
FI:
PF ← BitwiseXNOR(TEMP[0:7]);  //  PE = 将TEMP的低8位,从第0位开始,逐位取同或。也就是第0位与第1位的同或结果,去和第2位同或,结果再去和第3位同或....直到和第7位同或。
CF ← 0;                    // CF 和 OF 标志位设置0
OF ← 0;
(* AF is undefined *)      // AF 不确定

xchg

xchg ax,bx ; 交换两个寄存器的数据,两个操作数的类型要相同,内存和内存之间不能使用

xlat

xlat ; al = ds:[bx+al] 将BX指定的缓冲区中、AL指定的位移处的一个字节数据取出赋给AL

xor

xor 目的,源 ; 逻辑按位异或 指令;结果放到目的操作数。
; 影响标志位OF、SF、ZF、PF和CF。

标志寄存器

ZF(零标志位)

用于记录相关指令执行后的结果是否为0
为0: ZF = 1 不为0: ZF = 0
影响ZF的指令:add、sub、mul、div、inc、or、and等(大多数是运算指令)

PF(奇偶标志位)

用于记录相关指令执行后的结果低8位中1的数量是否为偶数
偶数: PF = 1 奇数: PF = 0

SF(符号标志位)

用于记录相关指令执行后的结果是否为负
负: SF = 1 非负 :SF = 0

CF(进位标志位)

一般情况下,在进行无符号运算时,记录运算结果的最高有效位向更高位的进位值(或借位值)
发生进位(借位):CF = 1 未发生进位(借位): CF = 0

OF(溢出标志位)

一般情况下,在进行有符号运算时,记录运算结果是否发生溢出
发生溢出:OF = 1 未发生溢出: OF = 0

AF(辅助进位标志位)

如果低8位中第 3 bit位向第 4 dit位产生进位发生
进位:AF = 1 未发生进位(借位): AF = 0

未完待续,持续更新中...

有关汇编指令的更多相关文章

  1. 【Linux】初识Linux --指令Ⅰ - 2

    Halo,这里是Ppeua。平时主要更新C语言,C++,数据结构算法,Linux…感兴趣就关注我吧!你定不会失望。目录1.ls显示当前目录下的文件内内容2.pwd-显示用户当前所在的目录3.cd-改变工作目录。将当前工作目录改变到指定的目录下1.cd-回到上一次待的工作空间2.cd..返回上一层目录1.相对路径:cd../aurora2.绝对路径:cd/home/aurora/lesson1/aurora3.cd~进入用户家目录4.cd/进入root目录4.mkdir-新建目录5.rmdir/rm-删除1.rmdir删除空文件夹2.rm删除1.rm-f2.rm-i3.rm-r1.ls显示当前目

  2. iOS快捷指令:执行Python脚本(利用iSH Shell) - 2

    文章目录前言核心逻辑配置iSH安装Python创建Python脚本配置启动文件测试效果快捷指令前言iOS快捷指令所能做的操作极为有限。假如快捷指令能运行Python程序,那么可操作空间就瞬间变大了。iSH是一款免费的iOS软件,它模拟了一个类似Linux的命令行解释器。我们将在iSH中运行Python程序,然后在快捷指令中获取Python程序的输出。核心逻辑我们用一个“获取当前日期”的Python程序作为演示(其实快捷指令中本身存在“获取当前日期”的操作,因而此需求可以不用Python,这里仅仅为了演示方便),核心代码如下。>>>importtime>>>time.strftime('%Y-%

  3. ruby-on-rails - 设计 skip_confirmation!未能避免发送确认指令 - 2

    我的应用程序设置为如果用户使用Oauth或Openid登录,他们不必确认他们的电子邮件地址。但是,Devise仍在发送电子邮件确认。当我调用User.skip_confirmation时!我得到一个未定义的方法错误。我的模型:classUserfalsedefself.find_for_facebook_oauth(access_token,signed_in_resource=nil)data=access_token.extra.raw_infoifuser=User.where(:email=>data.email).firstuserelse#User.skip_confirm

  4. ruby-on-rails - Rails 路由中的 "mount"指令是什么意思? - 2

    我在Railsroutingsystem中找不到关键字“mount”的含义.我已经设置了Mercury在我的Rails应用程序中使用。它将这一行添加到我的routes.rb配置文件中:Appname::Application.routes.drawdomountMercury::Engine=>'/'mount关键字是什么意思? 最佳答案 Mount在Rails路由中相当于Unixmount。它实际上告诉应用程序该位置存在另一个应用程序(通常是Rack应用程序)。它主要用于Rails引擎。

  5. APP连接ESP8266——采用AT指令 - 2

    1.主要实验设备及器材1.1一块ESP8266(如图1)图1 ESP8266模块1.2一个USB转TTL模块(如图2)图2 USB转TTL模块2.测试ESP8266模块 2.1连接设备        WIFI模块与USB转TTL模块进行连接,连接实物图如图3所示,硬件连线框图如图4所示。图3 连接实物图图4 硬件连接框图2.2打开串口调试助手        本次实验使用的软件是XCOMV2.3,默认波特率为115200,停止位为1,数据位为8,校验位为None(如图5)。图5 XCOMV2.32.3输入测试指令AT        测试AT启动,返回OK(如图6)图6 AT测试2.4复位指令AT

  6. 嵌入式:ARM内嵌汇编及C和ARM汇编相互调用 - 2

    内嵌汇编在C程序中嵌入汇编程序可以实现一些高级语言没有的功能,并可以提高执行效率。armcc和armcpp内嵌汇编器支持完整的ARM指令集;tcc和tcpp用于Thumb指集。但是内嵌汇编器并不支持诸如直接修改PC实现跳转的底层功能。内嵌的汇编指令包括大部分的ARM指令和Thumb指令,但是不能直接引用C的变量定义,数据交换必须通过ATPCS进行。嵌入式汇编在形式上表现为独立定义的函数体。内嵌汇编指令的语法格式__asm(“指令[;指令]”);ARMC汇编器使用关键字“__asm"。如果有多条汇编指令需要嵌入,可以用“{}”将它们归为一条语句。如:__asm{指令[;指令]…[指令]}各指令用

  7. Ruby代码美化,将长指令拆分成多行 - 2

    我们如何编写下面的语句来提高可读性?Promotion.joins(:category).where(["lft>=?andrgt{:shop_id=>shops_id}).count('id',:distinct=>true)以下不编译Promotion.joins(:category).where(["lft>=?andrgt{:shop_id=>shops_id}).count('id',:distinct=>true)syntaxerror,unexpected'.',expectingkEND.where(["lft>=?andrgt 最佳答案

  8. 【HAL库】STM32CubeMX开发----delay延时实验----NOP空指令 - 2

    STM32CubeMX下载和安装详细教程【HAL库】STM32CubeMX开发----STM32F103/F207/F407----目录前言HAL库有自带的ms级延时函数:HAL_Delay();缺点1:无法实现us级延时缺点2:此延时函数是由SysTick滴答定时器中断产生的,滴答定时器的中断优先级是所有中断中最低的,无法在其他中断中产生延时。一、STM32F407----delay延时实验本次实验以STM32F407VET6芯片为MCU,使用25MHz外部时钟源。系统时钟SYSCLK=168MHz,使用__NOP();空指令实现延时。User_delay.c#include"User_de

  9. javascript - 如何在 AngularJS 中有条件地应用指令? - 2

    我想使用ngAttr有条件地应用一个简单的指令。我不明白为什么总是显示我的指令。因此,如果我有一个undefined/false变量,我想应用我的指令:dirr。WhenusingngAttr,theallOrNothingflagof$interpolateisused,soifanyexpressionintheinterpolatedstringresultsinundefined,theattributeisremovedandnotaddedtotheelement.MycodepenDefaultdivangular.module('myApp',[]).directive

  10. javascript - 如何使用 Angular 2/4 的鼠标滚轮事件测试指令 - 2

    我有一个带有鼠标滚轮事件的指令,它用于放大和缩小Canvas。我想知道如何为此类事件编写单元测试。我在网上找不到任何示例,谁能给我指出正确的方向?我的指令:import{Directive,ElementRef,HostListener}from"@angular/core";import{MyService}from"./my-service";@Directive({selector:"[testDirec]"})exportclassTest{privateinitPointX:number;privateinitPointY:number;constructor(private

随机推荐