汇编语言学习笔记1

来源:互联网 发布:mac如何卸载迅雷插件 编辑:程序博客网 时间:2024/06/06 04:02

定义数组ARR                                       ARR  DW 1,2,3,4,5,6,7

ARREND       计算数组长度                         ARREND  DW ?

       MOV CX,(ARREND-ARR)/2

 

关系运算符                                          表达式1  关系运算符  表达式2

EQU       定义符号                          VAL  EQU  5H定义符号常量VALUE为5H

EQ         等于                                  MOV  BX,32 EQ  45

NE          不等

GT          大于

LT           小于

LE          小于等于

GE          大于等于

 

数值返回运算符

SEG        取段地址                   SEG  变量名/标号

OFFSET  取偏移地址               OFFSET  变量名/标号

TYPE      取类型值                   TYPE  变量名/标号/常数

对于变量,汇编语言将会送以字节数表示的类型:DB为1,DW为2,DD为4。对于标号,汇编程序将回送代表标号类型的数值:NEAR为-1,FAR为-2。对于常数,则回送0。

LENGTH 取长度               

SIZE              取总字节数               SIZE=LENGTH*TYPE

 

属性运算符

PTR        属性修改运算符       类型 PTR  表达式

:                                             段寄存器:地址表达式

SHORT  短取代运算符     用来修饰JMP指令中转向地址是在下一条指令地址的-128~127字节范围内

       JMP SHORT  NEXT

              .

.

       NEXT:MOV AX,BX

 

模块命名和标题伪指令

NAME    模块名         模块命名伪指令

TITLE     TEXT             标题伪指令

END              [标号]

       NAME    [模块名]

              .

              .

       END              [启动标号或过程]

-----------------------------------------------------------------------------------------------

DUP初始化               S  DB 30  DUP(0)定义30字节数组,所有数字初始化为0

ARRAY1  DB 2  DUP(0,1,2,?)   ;得到”0,1,2,-,0,1,2,-“, 2是重复次数

ARRAY2  DB 100  DUP(?)

 

 

完整段定义伪指令

段名      SEGMENT     [定位类型] [组合类型] [‘类别名’]

                     .

                     .

段名      ENDS

 

指定段寄存器伪指令

ASSUME              CS:CODE,ES:EXTRA,DS:DATA,SS:STACK

 

MOV  AX,4C00H;

INT  21H

 

MAIN  PROC  FAR

              PUSH  DS

              MOV  AX,0H

              PUSH  AX

                     .

                     .

              RET

MAIN  ENDP

 

 

EQU相当于C语言中的define

PURGE解除定义的伪指令

 

Y1=7

Y1=128

正确

Y2   EQU       7

Y2   EQU       128

错误

Y2   EQU       7

PURGE   Y2

Y2   EQU       128

正确

 

$地址计数器     $”直接表示地址计数器的值

 

ORG       常数表达式:使其后的指令或数据从表达式的值所指定的偏移地址开始存放

 


LABEL:符号名 LABEL 类型

 

JMP              无条件跳转指令

PUSH     进栈指令

       (SP)<-(SP)-2

       ((SP+1),(SP))<-(SRC)

POP              出栈指令

       (DST)<-((SP+1),(SP))

       (SP)<-(SP)+2

XCHG     交换指令    该指令的两个操作数必须有一个在寄存器中

 

 

IN                  输入指令           IN AL,5       5是端口号,从端口5输入一个字节到AL中)

如果是通过指令中的一个字节直接指明端口地址,则它只能寻址256个端口,如果通过DX的内容间接指明端口地址,则可以间接寻址65536个端口。若端口地址>=256时,则需要在IN指令之前必须预先将DX中装入所需要的端口地址。目的操作数只能是ALAX

OUTPUT       :输出指令       OUT 5,AL          (从AL中提取内容输出到端口5

       当端口号>=256时,必须先将端口号送入DX,再执行OUT指令)

 

 

LEA   REG,SRC:有效地址送寄存器         REG表示寄存器,源操作数只能是存储器寻址方式,目的操作数必须是一个161位通用寄存器,但不能使用段寄存器。

       LEA  BX,TABLE

       LEA  BX,[SI+OF62H]

LDS  REG,SRC:指针送寄存器DS指令

LES  REG,SRC:指针送寄存器ES指令

 

CBW:字节转换为字指令。将AL中的内容进行符号扩展到AH,形成AX中的字,若AL的最高有效位为0,则AH0;若AL的最高有效位为1,则(AH)=0FFHAL不变。

CWD:字转换双字节。将AX中的内容进行符号扩展到DX,形成DX:AX中的双字,即如果AX的最高有效位为0,则DX0;若AX的最高有效位为1,则(DX)=0FFFFHAL不变。

 

ADC  DST,SRC:   (DST)<-(SRC)+(DST)+CF     带进位加法指令,CF指上步运算的进位

INC        OPR(OPR)<-(OPR)+1    1指令

 

SBB  DST,SRC(DST)<-(DST)-(SRC)-CF           带借位减法

DEC  OPR:减1指令,不影响CF标志位

NEG  OPR:求补指令

CMP  OPR1,OPR2:比较指令,用(OPR1)-(OPR2)的结果来设置标志位。该指令与SUB一样执行减法操作,但它并不保存结果,只是根据结果设置条件标志位。该指令后往往跟着一条条件转移指令,根据比较结果产生不同的程序分支。

 

MUL  SRC:无符号数乘法

       (AX)<-(AL)*(SRC)        SRC为字节操作数

       (DX,AX)<-(AX)*(SRC)         SRC为字操作数

IMUL  SRC:带符号数乘法

 

DIV SRC:无符号数除法

       (AL)<-(AX)/(SRC)的商

       (AH)<-(AX)/(SRC)的余数

IDIV  SRC:带符号数除法

       (AX)<-(DX,AX)/(SRC)的商

       (DX)<-(DX,AX)/(SRC)的余数

 

逻辑运算符      

AND       逻辑与

OR         逻辑或

XOR              异或

NOT       逻辑非

TEST  OPR1OPR2:测试。由(OPR1)^(OPR2)的结果来设置标志位,不影响两操作数的值,不保存结果数。该指令可以测试目的操作数的某些位是否为01,源操作数应将需测试的位设为1,其余为0

        测试一个数的最高位是否为1MOV AL,90H

                                                               TEST  AL,80H

 

移位运算符

SHL/SHR OPR,CNT  逻辑左移/右移

       低位/高位补0,CF的内容为OPR最后移出的数位值

SAL  OPR,CNT:算数左移

       与SHL相同

SAR  OPR,CNT:算术右移

       最高位保持不变,即符号位保持不变

ROL/ROR  OPR,CNT:循环左移/右移

RCL/RCR  OPR,CNT:带进位循环左移/右移

       OPR连同CF标志一起连接起来,形成一个环,将环中的所有有向位向左循环移动CNT指定的次数,CF最后的内容为OPR最后移到CF中的数位值

      

      

重复前缀

1. REP    串指令

       (CX)=0则退出串操作,否则往下执行

       (CX)<-(CX)-1

       执行其后串操作

       重复前面步骤

2. REPE/REPZ      串指令(REPEREPZ完全相同)

(CX)=0ZF=0(即某次比较结果两个操作数不等)则退出串操作,否则往下执行

       (CX)<-(CX)-1

       执行其后串操作

       重复前面步骤

3. REPNE/REPNZ  串指令

(CX)=0ZF=1则退出串操作,否则往下执行(只要比较两数不相等并且ZF=1,就可以继续执行)

       (CX)<-(CX)-1

       执行其后串操作

       重复前面步骤

 

串处理指令

可以使用单条指令,也可以加重复前缀。CX16位寄存器,所以最大数据段长度为64KB

源串地址应设置在DS:SI,但可以指定段跨越前缀

目的串地址应设置在ES:DI,不能指定段跨越前缀

 

 

0 0