目录
汇编指令
nop指令
mov、add、sub指令
adc、sbb指令
and、or指令
移位指令
逻辑左/右移指令
循环左/右移指令
算术左/右移指令
带进位循环左/右移指令
inc指令
push、pop指令
pushf、popf指令
栈存储
栈原理
loop指令
word/byte ptr指令
div指令
mul指令
jmp指令
段内短转移
段内近转移
段间转移(远转移)
未定距离转移
条件转移指令
以CX寄存器为条件(jcxz)
以PSW寄存器为条件
cmp指令
cld、std、movsb、movsw指令
rep指令
call与ret指令
int与iret指令
in与out指令
指令操作规范
指令汇总
操作符汇总
书写规范
指向内容
任意常量
汇编指令
定义:有对应的机器码的指令,可以被编译为机器指令,最终被CPU执行。
nop指令
定义:用于占位的空指令,无任何效果,在指令书写处占用一个字节的内存空间
示例:nop指令在内存中的状态
PS:如上图所示,nop指令的机器码为90h,占用一个字节
mov、add、sub指令
定义:mov A,B 将B中的数据移入A;add A,B 将A与B相加的结果存入A;sub A,B 将A与B相减的结果存入A
示例1:mov与add指令对应到高级编程语言中
PS:汇编指令不区分大小写,即MOV等效与mov
示例2:使用高低8位寄存器的情况下的指令执行结果
PS:最后一条指令中,C5H与93H相加的结果为158,但因为al寄存器只能存储8位数据,因此最高位1因为数据溢出而被舍弃(因使用的是al寄存器进行独立运算,故该进位不会进入ah寄存器中)
示例3:mov指令操作段寄存器
PS1:如上图,mov指令不能修改段寄存器的内容为固定值(mov ds 2000或mov cs,0001),但可通过使用通用寄存器进行中转来实现这一过程(mov ax,2000 mov ds,ax)
PS2:mov、add指令操作固定地址的值时需要使用对内存寻址(mov 2000:1000,ffff或mov 2000:1000,ax或mov ax,2000:1000都是不成立的),具体方式见汇编学习笔记——寻址与存储对内存寻址部分
示例4:mov/add指令操作指令指针寄存器及add操作段寄存器
PS:如上图,mov与add指令都无法以任何形式操作指令指针寄存器ip,且add指令无法以任何形式操作段寄存器的值(sub指令的特性与add指令的特性相同)
adc、sbb指令
定义:adc A,B 将A与B相加的结果加上PSW寄存器中的CF位后存入A;sub A,B 将A与B相减的结果减去上PSW寄存器中的CF位后存入A(关于PSW寄存器及CF位相关,见汇编学习笔记——寄存器的标志寄存器PSW部分)
示例1:编程计算1EF0001000H+2010001EF0H,将结果存放于ax(高16位),bx(次高16位),cx(低16位)中
PS:如上图所示,先将最低16位相加,若有进位,则会将CF位置为1,再用adc将次高16位相加时便会加上该进位,最后使用adc将最高16位相加同理。adc指令因其将CF位加入计算的设计,可用于超大数据的相加运算。
示例2:编程计算003E1000H-00202000H,将结果存放于ax(高16位),bx(低16位)中
PS:如上图所示,先将低16位相减,若有借位,则会将CF位置为1,再用sbb将高16位相减时便会减去该借位。sbb指令因其将CF位加入计算的设计,可用于超大数据的相减运算。
示例3:使用adc指令进行超大数据相加
PS1:如上图1第2至8行所示,可定义任意的超大数据,此处为结果验证方便,使用了简单的数据
PS2:如上图1第31至48行所示,超大数据的相加减从其最低16位开始,将两个变址寄存器设为两段数据最低16位的起始位置后,使用loop指令进行循环相加
PS3:如上图低43行与第47行所示,对di和si使用sub等会影响CF位的指令前应当先将PSW寄存器入栈,使用结束后出栈,因需要CF位保存上一个循环中adc指令的结果
and、or指令
定义:and A,B 将A、B进行与运算的结果存入A;or A,B 将A、B进行或运算的结果存入A
示例:使用DOSBox测试and、or指令
PS1:如上图1,使用(ax)=0011001100110011b与(bx)=1100110011001100b进行两种指令的测试
PS2:如上图2、3,两种指令执行的结果忠实的反映在ax寄存器中存储的值上。
移位指令
定义:对二进制数据进行左移、右移的指令,根据特性分为逻辑、循环、算术、进位几种,移动的同时对PSW寄存器中的CF位产生影响。格式:移位指令 OPR,CNT 对OPR进行CNT次移位
示例:移位指令命名规范
PS:以上列出移位指令中各字母的含义,以降低记忆难度并加深理解
逻辑左/右移指令
定义:对数据进行逻辑左/右移,移动方向上的最高位进入CF,最低位补0。格式:SHL OPR,CNT 逻辑左移;SHR OPR,CNT 逻辑右移
示例1:逻辑移位图示
示例2:逻辑移位测试
PS1:如上图所示,左移一个数相当于令其*2,右移一个数相当于令其/2。以上1进行3次左移后成为8。
PS2:使用移位指令时,CNT的值为1时可直接使用立即数给出,否则必须使用cl寄存器存储
循环左/右移指令
定义:对数据进行循环左/右移,移动方向上的最高位进入CF的同时进入最低位。格式:ROL OPR,CNT 循环左移;ROR OPR,CNT 循环右移
示例:循环移位图示
算术左/右移指令
定义:对数据进行逻辑左/右移,移动方向上的最高位进入CF,最低位补0;特殊的一点在于,对于算术右移指令,其最低位补的是符号位的数值。格式:SHL OPR,CNT 逻辑左移;SHR OPR,CNT 逻辑右移
示例1:算术移位图示
PS:如上图所示,算术左移指令与逻辑左移相同,算术右移指令的移动方向上的最低位是其符号位,当符号位为1时补1符号位为0时补0
示例2:算术右移测试
PS:如上图所示,ah中的初值为85h即10000101b,右移后为c2h即11000010b可以看出右移方向上的最低位确实补上了符号位的1,并且其右移方向上的最高位1进入了CF,使之由NC(0)变为CY(1)
带进位循环左/右移指令
定义:对数据进行循环左/右移,移动方向上的最高位进入CF的同时,CF中原本存储的数值进入最低位。格式:RCL OPR,CNT 带进位循环左移;RCR OPR,CNT 带进位循环右移
示例:带进位循环移位图示
inc指令
定义:inc 寄存器(或[偏移地址]) 将给出的寄存器或偏移地址中存储的值加一
示例:使用DOSBox测试inc指令
PS:如上所示,每执行一次inc ax,ax寄存器内的数据便加一
push、pop指令
定义:push A 将A中的数据送入栈中;pop A 将栈顶数据取出送入A中
示例1:8086CPU中的栈图示
pushf、popf指令
定义:pushf 将PSW标志寄存器的值压栈;popf 将PSW标志寄存器的值出栈(关于PSW寄存器及CF位相关,见汇编学习笔记——寄存器的标志寄存器PSW部分)
栈存储
定义:栈在内存中的存储位置与栈大小是由栈段寄存器SS与栈顶指针寄存器SP共同决定的,SS中存放栈顶的段地址,而SP中存放栈顶的偏移地址(即栈的大小),而SS:SP地址则指向栈顶元素
示例1:当SS中存放1000,SP中存放0010时内存中的栈段示例
PS:如上,此时SS:SP即1000C为栈顶
示例2:使用代码测试栈的使用
PS1:测试用代码如上图1所示,先定义栈段,后进行入栈和出栈操作
PS2:常规出入栈测试如上图2与3所示,ax与bx分别出入栈之后,他们的值交互了(当需要交换几个寄存器中的数据时,可参考该方案)。
PS3:虽然通过SS与SP规定了栈的大小,但实际上系统并不会对越界行为进行检测,如上图4所示,通过多进行两次pop操作,可以访问到栈外元素
PS4:如上图4所示,栈内的第一个单元(1000:0000)不存储数据,栈内每个元素占据一个字单元(字单元的概念见汇编学习笔记——寻址与存储)
栈原理
定义:push与pop指令的执行实际上是由mov、sub、add三种操作复合而成的
示例1:push指令机理
示例2:pop指令机理
PS:应当牢记,push操作会先使sp的值减小后将ax的内容入栈;pop操作会先将ss:sp的值出栈入ax后使sp的值增大
loop指令
定义:loop A 先将cx寄存器中的数据减一,后判断cx的值是否为零,若为零则程序继续向下执行,否则程序跳转至标记为A处的代码继续执行。其中A称为loop标号,可为任意字符串
示例1:测试使用loop指令实现循环累加
PS1:如上图所示,将cx设为2后,loop指令将进行两次循环,将ax中的值自0累加至2
PS2:如上所示,自定义的loop标号在汇编程序完成编译后将被解析为标号处的地址(见上图2的最后一行,loop loopy被解析为loop 0006,而ip=0006正是loopy标号所在的inc ax代码行在内存中的偏移地址),因此loop实际上和jmp做了相似的行为,区别在于loop在执行前需要对cx中的值进行一次判断
PS3:对应到高级编程语言中,loop实际上类似于do…while循环语句,其循环体无论如何都会被执行至少一次
示例2:计算ffff:0006字节单元中的数乘以3,并将结果存储在dx中
PS1:以上第三行中,将ffff移入ax时需要将之写为0ffff。因在汇编源程序中,数据不能以字母开头
PS2:以上第七行中,将ah置为0,是为了保证ax的值同al中的值相等
示例3:指令机器码辨析
PS:如上图所示,loop s的机器码为E2FC,FC即-4,加上下一条指令的偏移地址000A后正好为s所在的add ax,ax的偏移地址0006
word/byte ptr指令
定义:在没有寄存器参与的内存单元访问指令中,可显性的指明所要访问的内存单元的长度。格式:word ptr 指明所要访问的内存为字单元;byte ptr 指明所要访问的内存单元为字节单元
示例:使用两种指令改变数据
PS1:如上图1所示,该指令是通过嵌入其他指令生效的
PS2:如上图2所示,使用byte ptr操作数据时,只改变了073f:0002一个字节的数据,而当使用word ptr操作数据时,改变了073f:0002与073f:0003连个字节即一个字单元的数据
div指令
定义:div A 以A为除数(A可以是寄存器或内存单元,不可以是立即数(常数))。若A为8位数据,则默认被除数保存与AX中,完成除法之后商存放在AL中,余数存放在AH中;若A为16位数据,则默认被除数的低位保存于AX中,高位保存于DX中,完成除法后商存放在AX中,余数存放在DX中。
示例1:8位除法示例
PS1:如上图2所示,在div bl导致(ax)/(bl),结果中的商为40,存入al,结果中的余数为08,存入ah
PS2:如上图3所示,在div bl导致(ax)/(bl),结果中的商为40,存入al,结果中的余数为00,存入ah
示例2:16位除法示例
PS1:如上图2所示,在div bx导致(dx)*10000H+(ax)除以bx,结果中的商为400,存入ax,结果中的余数为88,存入bx
PS2:因被除数必须存储于ax与dx中,故若进行除法时,ax与dx寄存器中已存储其他重要数据,则应将其暂时压栈或存入其他内存单元,完成除法后再复原
mul指令
定义:mul A 以A为乘数(A可以是寄存器或内存单元,不可以是立即数(常数))。若A为8位数据,则默认被乘数保存与Al中,完成乘法之后结果存放在AX中;若A为16位数据,则默认被乘数保存于AX中,完成除法后结果的低位存放在AX中,高位保存于DX中。
示例1:乘法规则
PS:如上图,乘法的规则同除法相当类似
示例2:乘法示例
PS:如上图,0100H与0100H相乘后成为00010000H,其中dx保存0001,ax保存0000
jmp指令
定义:无条件转移指令。格式:
jmp 段地址:偏移地址 用指令中给出的段地址修改CS寄存器,偏移地址修改IP寄存器(该用法无法被常规编译器中编译,利用debug直接操作内存时可用);
jmp 某一合法寄存器 用指令中给出的寄存器内存储的值修改IP寄存器;
jmp 地址标号 用地址标号所代表的内存地址的值修改IP寄存器(该用法只在面对编译器编程中可用)
示例1:使用jmp在两段存储与不同内存地址处的代码间跳转示意图
PS:以上代码从2000:0000即20000开始执行,执行到jmp 1000:3时跳转至10003处的mov ax,0000,继续执行至jmp bx时跳转至10000处的mov ax,0123
示例2:在DOSBox内使用debug功能测试示例1中的代码
PS1:上图1中完整的将目标代码写入了对应内存区段
PS2:上图2为逐条执行代码的结果,可以看到程序执行符合预期,第一次jmp指令同时改变了cs和ip内的值,第二次jmp指令只改变了ip内的值
PS3:虽然mov指令同样可以间接的操作段寄存器,但是因其无法以任何形式操作指令指针寄存器,故当需要对代码段寄存器CS与指令指针寄存器IP进行操作时,优先使用jmp指令
段内短转移
定义:只改变ip寄存器值的跳转方式,且一次修改的数据最大为一个字节(IP的修改范围为-128~127)。格式:jmp short 地址标号
示例:短转移机器码辨析
PS:如上图所示,jmp short s的机器码为EB03,意为将ip寄存器的值加上03。当执行完076a:0003处的指令时,ip寄存器内的值为0005,加上03为0008正好指向s标号所处的inc ax的内存地址076a:0008处。由此可得,jmp short的机器指令原理是跳转到指令的相对位置而非绝对位置。
段内近转移
定义:只改变ip寄存器值的跳转方式,且一次修改的数据最大为一个字(IP的修改范围为-32768~32767)。格式:jmp near ptr 地址标号
示例:近转移机器码辨析
PS:如上图所示,jmp near ptr s的机器码为E90001,意为将ip寄存器的值加上0100(内存存储的数据高位在后,低位在前)。当执行完076a:0006处的指令时,ip寄存器内的值为0009,加上0100为0109正好指向s标号所处的add ax,1的内存地址076a:0109处(db 256 dup(0)占用256个字节即0100h个字节)。由此可得,jmp near ptr的机器指令原理是跳转到指令的相对位置而非绝对位置。
段间转移(远转移)
定义:同时改变cs和ip寄存器值的跳转方式,一次跳转的长度没有限制。格式:jmp far ptr 地址标号
示例:远转移机器码辨析
PS:如上图2所示,jmp far ptr s的机器码为EA0B016A07,转译之后为076a010b(内存存储的数据高位在后,低位在前),意为将cs寄存器的值置为076a,将ip寄存器的值置为010b。如上图1,3所示,s标号所处的add ax,1的内存地址确为076a:010b。由此可得,jmp far ptr的机器指令原理是跳转到指令的绝对位置而非相对位置。
未定距离转移
定义:当使用类似jmp 寄存器或jmp 内存地址 时,转移的长度由寄存器的大小/内存的大小决定
示例1:使用寄存器时的jmp
PS:如上图所示,jmp bx的机器码为ffe3,并未出现固定的数值,具体转移位置由指令执行时BX内的数值决定
示例2:使用内存单元时的jmp
PS:如上图所示,使用内存单元时必须显性的标明内存单元的大小,根据内存单元的大小,指令会以不同的方式执行
条件转移指令
定义:根据某种条件为判据,判断为真则进行跳转,判断为假则不跳转
以CX寄存器为条件(jcxz)
定义:当cx寄存器中的值为0时进行跳转,否则不跳转,且一次修改的数据最大为一个字节(IP的修改范围为-128~127)。格式:jcxz 地址标号
示例1:当超出最大IP修改范围,编译器报错
PS:如上图所示,jcxz无法修改超过一个字节的ip范围,且不支持near ptr/far ptr等修正,此处与jmp区分
示例2:指令机器码辨析
PS:如上图所示,jcxz ok的机器码为e304,正好为ok所在的mov dx,bx的偏移地址0010减去jcxz下一条指令的偏移地址000c
以PSW寄存器为条件
定义:根据PSW中各标志位的状态进行条件判断,判断结果为真则跳转
示例:跳转指令表格
PS:以上跳转指令多同cmp指令协同使用,其中图4为以上指令中的各字母的释义,可帮助理解与记忆
cmp指令
定义:cmp A,B 计算A-B并根据计算结果改变PSW寄存器中的各标志位,但不会将A-B的值存储到任何位置,也不会影响A、B的值
示例1:当AX、BX中存储无符号数时,执行完cmp ax,bx后PSW的状态代表的信息
PS:如上所示,cmp作为一种比较指令,可用于比较各数值间的关系,实质上将cmp换位sub指令以上表格也成立,但cmp指令因其不对ax和bx的值产生影响而更为合适
示例2:当AX、BX中存储有符号数时,执行完cmp ax,bx后PSW的状态代表的信息
PS:同无符号数的比较相似,但因符号位的存在而有所差别
示例3:cmp与条件转移指令配合实现if结构
PS1:如上所示,通过配合使用两种指令,图1的汇编代码可达成图2的c代码的效果
PS2:若把je换成ja/jg,则if条件变为a>b;若jb,则if条件变成a<b。灵活变动、嵌套条件转移语句与比较语句,便能达成多种结构。
cld、std、movsb、movsw指令
定义:cld 将标志寄存器PSW的DF位设为0(clear);
std 将标志寄存器PSW的DF位设为1(setup);
movsb 以字节为单位将ds:[si]处的数据复制至es:[di]并根据DF位的值改变si和di的值;
movsw 以字为单位将ds:[si]处的数据复制至es:[di]并根据DF位的值改变si和di的值
示例1:串处理指令movsb与movsw与DF的关系
PS:根据需求定义好si与di的初值并使用cld/std设置好DF位的值后,即可使用movsb/movsw快速进行数据复制
示例2:使用串处理指令传输数据
PS:如上图所示,通过使用movsb指令,可以简洁快速的完成数据的复制操作
rep指令
定义:根据cx的值,重复执行其修饰的指令,重复次数即cx中的值。格式: rep 某指令
示例:使用rep实现高效复制数据
PS:rep指令可以看做简化的loop指令,当需要重复执行的指令只有一条时,用rep代替可提高代码可读性,使之更为简洁。
call与ret指令
定义:call子程序调用指令,调用时跳转,完成调用后使用ret/retf指令可返回调用处的下一条指令继续执行。格式:call 标号 将ip压栈,并跳转至标号处;call far ptr 标号 将cs压栈将ip压栈,并跳转至标号处。
ret 子程序返回指令,调用时跳转。格式:ret 将ip出栈;retf 将ip出栈将cs出栈;ret/retf idata 将ip/ip与cs出栈后再将sp的值加上idata
示例1:call指令的实质
PS1:如上图,call 标号;相当于push ip与jmp near ptr 标号;的结合,当调用call时,ip切实被压入栈内了。其机器码也如同jmp,是相对地址跳转
PS2:如上图,ret相当于pop ip,当调用ret时,ip切实被出栈的数据取代了。
PS3:实质上,call 也可和jmp一样,可与寄存器、内存单元一同使用。其原理机制也和jmp完全相同(进行反汇编时,此类形式最为常见),故此处不再赘述。call与jmp唯一的区别在于call没有短转移,且call多了一步压栈。
示例2:ret与retf的机理
PS1:如上图所示,ret和retf并不依赖于call,可以手动压栈任意希望跳转的地址后直接调用,因其实质为pop操作
PS2:当使用call和ret指令的时候一定会使用到栈,因此在程序中一定要预先定义好栈结构,否则程序会调用未知的内存空间作为栈,这极不稳定,可能导致程序错误
PS3:若在使用call进入子程序时同时使用了栈作为参数传递的媒介,在结束时应该使用ret idata来清除栈中的参数(ret idata 相当于 pop ip后add sp,idata。若栈中有两个参数,分别占用2个字节,则使用ret 4即可使sp跳过两个参数,达到清除栈中无用参数的目的)
int与iret指令
定义:int n 引发中断类型码为n的中断;iret 在中断程序中使用,返回引发中断的程序。
示例1:编写程序时引发中断
PS1:如上图1,为编写汇编程序时必写的代码,其实质上是引发DOS提供的中断类型码为21h的中断,并调用中断程序中的4c(存放在ah中)号子程序,将0(存放在al中)作为返回值提交给系统的同时将CPU交还给系统。
PS2:如上图2,在执行程序时,可用int引发任意中断,可以是系统提供的,也可以是自定义的。
PS3:类似高级编程语言,汇编同样可以调用大量已编写完成的程序来完成功能。这些程序通常由BIOS和DOS系统以中断的形式提供,当需要使用时便可用int指令进行调用
示例2:编写并调用功能性中断程序
PS1:如上图所示,编写一个中断类型码为7ch的中断程序并将之存入0:200h开头的内存单元中,将中断程序的起始地址写入中断向量表(IAT)中中断类型码对应的区域。
PS2:如上图所示,执行int指令时类似call指令,执行iret指令时类似retf指令,区别在于作为中断调用多了为标志寄存器的入栈和出栈操作(因为进入中断程序必然改变TF和IF的值,故需要先保存PSW)。在中断程序执行一次乘法操作之后,使用iret返回原程序继续执行,同call指令产生的效果相似。
in与out指令
定义:用于读写端口以此操作外部设备的指令。格式:in al/ax,idata/dx 将idata或dx代表的端口中的数据读入al/ax中;out idata/dx,al/ax 将al/ax中存储的数据写入idata或dx代表的端口
示例:通过读写端口令扬声器发声
PS1:如上所示,以上代码编译链接之后执行效果为扬声器发出一声哔’。更多端口操作示例见汇编学习笔记——外部设备,端口相关知识见汇编学习笔记——寻址与存储的端口部分
PS2:当操作的端口在0~255范围内时,端口号可用立即数给出;当操作的端口在256~65535范围内时,端口号必须放在dx中。in/out指令使用的寄存器都是固定的,al/ax/dx不可替换,访问8位端口时用al,访问16位端口时用ax。
指令操作规范
定义:各种指令有其对应的使用规范,以下列出部分
示例:mov/add/sub的使用规范
PS:以上只列出部分,更多使用规范可自行测试探索
指令汇总
定义:除以上提到的指令之外,仍有大量汇编指令是不那么常用,但于某些状况下十分便利的。
示例1:数组传送类指令汇总
PS:LAHF/SAHF/PUSHF/POPF/CBW与CWD是无操作数指令
示例2:算术指令汇总
PS:如上图4、上图2所示,计算机中常用BCD码保存十进制数,但这样保存的数进行运算时,应用的是2进制-16进制运算规则而非十进制运算规则,导致其运算结果出现偏差。使用如上图3所示的BCD码调整指令即可修正错误的运算。
示例3:逻辑指令汇总
PS:以上逻辑指令已于文章前部全数分析完毕,此处不做赘述
示例4:串处理指令汇总
PS:如上图3所示,使用scasb(scan string by byte)配合repne(repeat when not equal)实现循环查找一个字符串中的字节型数据。其中al中保存目标字节,cx中保存最大循环次数。当执行完毕时cx不为小于零的数,则代表查找成功(有些程序会利用该手法在自身代码中查找机器码CC(对应指令int 3,调试器使用该指令实现软件断点)来进行反调试)。
示例5:控制转移指令汇总
PS:以上控制转移指令已于文章前部全数分析完毕,此处不做赘述
示例6:处理机控制与杂项操作指令
PS:至此,所有汇编指令汇总完毕,若对某个特殊指令有使用的需求,请搜索查找对应的详细信息学习。
操作符汇总
定义:除各类汇编指令外,同指令一同使用的操作符也相当常见,将各类元素组合为表示式的操作符是十分必要且便利的。
示例1:算术操作符汇总
PS:以上为最常见常用的算术操作符,无需赘述
示例2:逻辑和移位操作符汇总
PS:以上逻辑与移位操作符实际上同逻辑与移位指令,当将之用于组合元素为表达式时,视为操作符
示例3:关系操作符汇总
PS:类比jmp指令的各类条件跳转衍生指令,以上关系操作符对两个元素进行关系运算,将运算结果作为表达式的值给出(如LE代表比较操作符两边的元素是否相等)。
示例4:数值回送操作符汇总
PS:如上图1所示,offset操作符已于文章上部进行过解析;type操作符检测操作数的数据类型,并将其数据类型以数字的形式给出(db字节型则为1,dw字型则为2);length操作符检测操作数是否为dup定义的数组,若是则给出数组的大小;size操作符相当于length与type的联合,给出操作数占用的空间大小。如上图2为各操作符的使用示例
示例5:属性操作符汇总
PS:如上图,ptr、段操作符、short操作符已于文章上部解析;this操作符类似伪指令中的label指令,用于指定操作数的数据类型;high操作符取操作数的高位作为结果值,low操作符取操作数的低位作为结果值。
书写规范
定义:实际编程中不使用的,纯粹用于书面描述的一些规范
指向内容
定义:当书写汇编代码时,若需要表示一个内存单元内或寄存器内的内容,应当将之用小括号围起。格式:(内存单元或寄存器)
示例:几种汇编代码的描述方法
对于add ax,2;将之描述为(ax)=(ax)+2
对于mov [2],ax;将之描述为((ds)*16+2)=(ax)
PS:在实际编程中,并不使用小括号,此种描述方式只用于书面表达
任意常量
定义:当书写汇编代码时,若需要表示一个任意值的常量,可用idata表示,将此类出现在代码中并直接给出具体数值的数称为‘立即数’。
示例:几种书写方式代表的汇编代码
mov ax,[idata];代表mov ax,[1]、mov ax,[2]、、、、
mov bx,idata;代表mov bx,1、mov bx,2、、、、
PS:在实际编程中,并不使用idata,此种描述方式只用于书面表达