1.2008/5/13 补码:正->最高位零+数的绝对值 负->最高位壹+2^n -数的绝对值 2.负数补码-->正数转二进制-->取反-->末位+1 3.符号扩展: 正-->高位全填零+补码 负-->高位全填壹+补码 4.求补:各位取反+壹 求补=它的负数,再求补=它本身 5.补码加减法-->A补+B补 或A补+(-B)补
6.2008/5/17 寻址方式:df ⑴立即寻址 mov ax, 1234h ⑵寄存器寻址 mov ax,bx ⑶直接寻址 mov ax,[value] //默认是cs段,如果是附加段刚是 mov ax,ex:[value] ⑷寄存器间接寻址 mov ax,[register] //register必须是si,di,bx,bp 如果是si,di,bx则段值为ds段寄存器, 如果是bp则段值为ss段寄存器 ⑸寄存器相对寻址 mov ax,[reg+offset] 7.2008/5/18 指令系统: (1)数据传送 (2)交换指令 (3)地址传送指令 (4)堆栈操作指令 (5)标志操作指令
8.数据传送 (1)CPU内部寄存器: 源和目的操作数不能同时是段寄存器;代码段寄存器不cs不能作为目的;指令指针ip不能作为源或目的 9.xchg oprd1,oprd2 1和2不能同时是段寄存器或存储单元 10.lea reg,oprd 传送有效地址指令,reg为通用寄存器,oprd为存储器操作数 11.lds reg,oprd 操作: (reg) <--(src) (ds) <-->(src+2) 12.les reg,oprd
13.堆栈指令 (1)栈底一端地址较大,栈顶地址小 (2)堆栈的段值在堆段寄存器中, (3)堆栈指针sp始终指向栈顶 (4)存取必须以字为单位 一。进栈指令push push src 操作 (sp) <--(sp)-2 二。出栈指令pop pop dst 操作 (sp)<--(sp)+2 push ,pop只能作字操作,可以使用除立即数以外的其他寻址方式 pop指令不允许用cs寄存器 两条指令不影响标志位 14.标志操作指令 (1)标志传送指令 A.LAHF 把低8位sf,zf,af,pf,cf传送到ah中 B.SAHF 把ah传到flag低8位 C.PUSHF 把标志寄存器的内容压栈(sp减2,内容送到sp指向的栈顶) D.POPF (2) 15.OF若两操作数相同,但结果的符号与之相反时,of为1,否则为0
16.加减运算指令 (1)add oprd1,oprd2 (2) adc oprd1,oprd2 (3) inc oprd (结果影响标志zf,sf,of,pf和af,但不影响cf)
(4) sub oprd1,oprd2 减 法的of位,若两个数的符号相反,结果的符号与减号相同,则of=1 (5) sbb oprd1,oprd2 (6) dec oprd (7)neg oprd 对操作数求补,也就是用0减去操作数 (8)cmp oprd1,oprd2 oprd1减去oprd2,但结果不送到oprd1 根据zf是否置位,判断两者是否相等,zf=1,为零,相等,zf=0,不相等 若两者为无符号数,根据cf判断大小,cf=0,没借位,大于,cf=1,有借位,小于 若两者为有符号数,根据sf,of判断大小 当没有溢出时(of=0),若sf=0,则a>b,否则a<b 当有溢出时(of=1),若sf=0,则a<b,否则a>b 17.对于dword的求补,先从高位进行
18.乘法指令 一个操作数总是隐含在寄存器ai(8位相乘)或(16位相乘) 另一个操作数采用非立即数以外的任一种寻址方式 (1)无符号乘法MUL MUL oprd 两个8位数相乘,结果放在16位ax中 两个16位数相乘,结果放在dx高位,ax低位中 :如果乘积结果高半部分(ah或dx)不等于零,则标志cf=of=1;否则cf=of=0; :指令对其他标志位无定义,只对cf,of有定义 (2)带符号乘法IMUL IMUL oprd 如果乘积结果不是低半部分的符号扩展,则标志cf=of=1;否则cf=of=0; 19.除法指令 (1)无符号除法DIV DIV oprd 字节操作: (al)<--(ax)/(oprd)的商; (ah)<--(ax)/(oprd)的余数 字操作: (ax)<--(dx,ax)/(oprd)的商; (ax)<--(dx,ax)/(oprd)的余数 如果除数为零,或8位数除时,商超过8位时,或16位数除时,商超过16位时,则认为是除溢出,引起0号中断 除法指令对标志位的影响无定义 (2)有符号除法指令IDIV 除数为零,或商太大,字节除时超过127,字除时超过32767 或商太小,字节除时小于-127,字除时小于-32767 引起0号中断 20.符号扩展指令 (指令不影响标志位) (1)字节转换成字指令cbw 把寄存器al中的符号扩展到寄存器ah (2)字转换成双字指令cwd 把寄存器ax中的符号扩展到寄存器dx 21.逻辑运算和移位指令 (1)否操作指令 NOT oprd (对标志没有影响) (2)与操作指令 AND oprd1,oprd2 (标志cf=0,of=0,pf,zf,sf反映运算结果) (3)或操作指令 OR oprd1,oprd2 (4)异或操作指令 XOR oprd2,oprd2 (5)Test测试指令 Test oprd1,oprd2 与指令and类似,只是不把结果送到操作数oprd1 22.一般移位指令 (1)算术左移或逻辑左移指令SAL/SHL (右边用0补足,移出的最高位进入标志位cf) SAL oprd, m SHL oprd, m 移位数超过1位的,先把移动次数放到cl中 (2)算术右移SAR (左边的符号位保持不变,移出的最低位进入标志位cf) SAR oprd, m (3)逻辑右移SLR (左边用0补足,移出的最低位进入标志位cf) (4)循环移位指令 ROL oprd, m ROR oprd, m (移8位或16位后复原) RCL oprd, m RCR oprd, m (移9位或17位后复原) 23.2008/5/20 1.无条件转移指令 (1)段内直接转 JMP 标号 A.段内近跳转地址差只用一个字节表示 JMP NEAR PTR PROG B.段内短跳转地址差用一个字表示 JMP SHORT QUEST (2)段内间接转 JMP WORD PTR [oprd] 由oprd的内容给定的目标地址处 (3)段间直接转 JMP FAR PTR 标号 把指令中包含的目标地址的段值和偏移分别置入cs和ip (4)段间间接转 JMP DWORD PTR [oprd] 双字存储单元的低字内容送到ip,高字内容送到cs 2.条件转移指令 所有条件转移都是段内转移,条件迁移指令不影响标志 有符号,G大于,E等于,L小于 无符号,A高于,E等于,B低于 3.循环指令 不公属于段内转移,采用相对转移,即在IP上加一个地址差的方式实现转移 循环指令只用一个字节表示地址差,如果以循环指令本身作为基准,转移的范围在-126+129之间 循环指令不影响各标志 (1)计数循环指令LOOP LOOP 标号 这条指令使寄存器cx的值减1,结果不等于0,则跳到标号,否则顺序执行 类似于 dec cx ,jnz 标号 (2)等于/全零循环指令LOOPE/LOOPZ LOOPE 标号 LOOPZ 标号 cx减1,当为0 或 相等时(标志zf等于1),则转移到标号 (3)不等于/非零循环LOOPNE/LOOPNZ (4)跳转指令JCXZ JCXZ 标号 当cx的值等于0时,转移到标号,此指令一般用在循环开始前 2008/5/24 24.语句的种类和格式 1.指令语句 可翻译成机器指令 (标号:)指令助记符 (操作数(,操作数)) (;注释) 2.伪指令语句 没有与其对应的机器指令 (名字)伪指令定义符 (参数,参数) (;注释) 标号及名字最多由31个字母及特殊字符(?@_S)等组成,并且不能以数字开头 25. 数值表达式 RADIX 伪指令改变基数 26.关系运算符 相等EQ,不等NE,小于LT,大于GT,小于或等于LE,大于或等于CE, 运算结果是个数值,若关系不成立,则结果为零 若关系成立,结果为0ffffh. 27.数值表达式中使用的操作符 HIGH LOW LENGTH SIZE OFFSET SEG TYPE WIDTH MASK 2008/5/25 28.运算符和操作符的优先级 (1)圆括号,尖括号,方括号,圆点符,LENGTH,SIZE,WIDTH,MASK. 尖括号用在记录中,圆符用在结构中 (2)PTR,OFFSET,SET,TYPE,THIS,冒号. 冒号用于表示段越越前缀 (3)*,/,MOD,SHL,SHR (4)HIGH,LOW (5)+,- (6)EQ,NE,LT,LE,GT,GE (7)NOT (8)AND (9)OR,XOR (10)SHORT 29.变量和标号 变量表示的存储单元中存放数值 标号表示的存储单元中存放指令代码 三种属性: (1)段值 (2)偏移 (3)类型,变量主要有BYTE,WORD,DWORD;标号类型主要有NEAR ,FAR 30.重复操作符DUP count DUP (表达式[,表达式2]) 31.析值操作符(数值回送操作符) SEG OFFSET TYPE :变量名或标号 LENGTH SIZE 变量名 (1)SEG 返回变量所在段的段值 (2)OFFSET 返回变量或标号的偏移 (3)TYPE 返回变量或标号的类型,类型用数值表示 规定 BYTE 1, WORD 2, DWORD 4 ,NEAR -1, FAR -2 (4)LENGTH 返回利用DUP定义的数组中元素的个数 如果变量定义语句中没有DUP,则返回1 如果嵌套使用DUP,则返回最外层的重复数 (5)SIZE 返回用DUP定义的数组占用的字节数 SIZE 变量 = (LENGTH变量) * (TYPE变量) 32.属性操作符 PTR 33.符号定义语句 1.EQU 等价语句 等价语句不另给符号分配存储单元,定义的符号不能与其他符号相同,也不能被重新定义 2.= 等号语句 3.LABEL 定义符号名语句 BUFFER LABEL WORD BUFF DB 100 DUP(0) 使符号的段属性和偏移属性与下一个紧接着的存储单元的段属性和偏移属性相同 4.段定义语句 A.段开始和结束语句 段名 SEGMENT 段名 ENDS B.段使用设定语句 ASSUME 如果段名域设为NOTHING,表示某个段寄存器不再与任何段有对应关系 C.ORG 使用地址计数器来保存当前正在汇编的指令或者变量 的地址偏移 $表示地址计数器的值 34. XLAT ==> al <--bx +al
2008/2/26.35.过程调用指令 (1)段内直接调用 CALL DST 操作: sp <= sp-2 [sp] <= IP IP <= IP +disp (2)段内间接调用 CALL OPRD (16位通用寄存器或字存储器操作数) (3)段间直接调用 CALL 过程名 操作: sp <= sp-2 [sp] <= cs (下条语句段值) sp <= sp-2 [sp] <= ip (下条语句ip) ip <= 过程入口地址的偏移 cs <= 过程入口地址的段值 (4)段间间接调用 CALL OPRD (双字存储器操作数) 36.过程返回指令 过程返回指令不影响标志位 (1)段内返回指令 RET ip <= [sp] sp <= sp+2 (2)段间返回指令 (3)段内带立即数返回指令 RET 表达式 (结果取整) ip <= [sp] sp <= sp + 2 sp <= sp + data 对堆栈的正常操作均是以字为单位 先从堆栈弹出一个字作为返回地址,再额外根据data修改堆栈指针 (4)段间带立即数返回指令 37.过程定义语句 过程名 PROC [NEAR | FAR] 过程名 ENDP 38.主程序与子程序间的参数传递 寄存器传递法, 约定内存单元传递法, 堆栈传递法, CALL后续区传递法 39.2008/5/28 Dos功能调用及应用 dos的各种命令是通过调用这些子程序实现的. dos功能调用主要包括三方面的子程序: 设备驱动(基本I/O),文件管理和其他(内存管理,置取时间,置取中断向量,终止程序等) 调用方法:(1)准备入口参数 (2)调用号送AH寄存器 (3)发软中断指令"INT 21H" 40.2008/5/29 输入输出与中断 I/O指令 (1)输入指令 IN 累加器,端口地址 A.直接方式表示端口地址时,端口地址仅为8位,0~255 IN AL,PORT ;AL <= (PORT) IN AX,PORT ;AX <= (PORT+1: port) B.间接方式表示端口地址时,端口地址为16位,存放在DX寄存器串 IN AL,DX ;AL <= (DX) IN AX,DX ;AX <= (DX+1:DX) (2)输出指令 OUT 端口地址,累加器 (3)数据传送方式:无条件传送方式,查询方式,中断方式,直接存储器传送(DMA) 41.2008/5/30 查询传送方式 eg.输入数据寄存器端口为50,状态寄存器端口为51h 查询: IN AL,51h ; TEST AL,02h ;检查状态 IN AL,50h MOV BUFF[DI],AL ;数据输入到BUFF[DI] 42.中断 使CPU挂机正在执行的程序而转去处理特殊事件的操作 引起中断的事件称为中断源 每中断一次,只传送一次数据,速度并不高 43.每种类型的中断都由相应中断处理程序来处理 中断向量表就是各中断类型的处理程序的地址表 存储器的低1.5K字节,地址从0到5ffH为系统占用,其中最低的1K字节,地址从0到3ffH存放中断向量. 256项中断对应256中断类型,每项占四个字节,其中两个字节存放中断处理程序的 段地址,另两个存放偏移地址. 每个中断向量的地址可由中断类型号乘以4计算出来 CLI 中断标志if置 0 STI 中断标志if置 1 44. DOS利用25H号系统设置中断微量 AL = 中断微量(类型)号 DS = 中断处理程序入口地址的段值 DX = 中断处理程序入口地址的偏移 DOS利用35H号系统取得中断微量 AL = 中断微量(类型)号 ES = 中断处理程序入口地址的段值 BX = 中断处理程序入口地址的偏移 45. 2008/6/2 中断返回指令 IRET 具体操作: IP <= [sp] SP <= SP +2 CS <= [sp] sp <= SP+2 FLAGS<= [sp] 46.外部中断分为:INTR接受可屏蔽中断请求, NMI接受非屏蔽中断请求 外设的中断请求可通过中断控制器8459A传给INTR,8259A接收8个独立的 中断请求信号IRQ0到IRQ7 8259A包含两个寄存器:中断屏蔽寄存器和中断命令寄存器 中断屏蔽寄存器的I/O端口地址是21H,8位对应8个外设,设置这些位为0允许,1为不允许中断 8259A中断命令寄存器,I/O端口地址是20H, ( R_SL_EOI_0_0_L2_L1_L0 ) R位和SL位控制IRQ0-IRQ7的中断优先级次序,L1-L3指令IRQ0_IRQ7中最低优先级的中断请求 EOI表中断结束位,当它为1时,表中断处理结束. 当响应某中断后,8259A不再传相同或较低的外设中断请求,直到中断结束命令为止 47.由INTR传入的外部中断请求为可屏蔽的外部中断请求,由此引起的中断称为可屏蔽中断.当IF为1时,才响应 外设中断请求.
48.CPU响应中断的时候,CLI把IF置为0,所以中断嵌套多发生在内部中断和非屏蔽中断
IN AL,21H AND AL,11110111B OUT 21h,AL 中断屏蔽寄存器的两个必要条件:A.相应位为0,IF为1 48.内部中断 由于内部中断是CPU在执行某些指令时产生,所以也称为软中断] 中断INT引起的中断 INT n N是一个0~0FFH的立即数 49.特殊情况引起的中断 (1)除法错中断 (2)溢出中断 INTO 如果OF为1,执行此指令,则产生溢出中断,溢出中断的类型号是4 50.用于程序调试的中断 (1)单步中断 单步中断标志TF为1,每条指令执行后产生一个单步中断,中断类型号为1 (2)断点中断 INT 3 51.中断优先级 内部中断(除法错,INTO,INT) > 非屏蔽中断(NMI) > 可屏蔽中断(INTR)(IRQ0>IRQ7) > 单步中断 (IRQ0-IRQ7:定时器,键盘,保留,串行口2,串行口1,硬盘,软盘,打印机) 52. 2008/06/03 字符串处理 SI指向源串,DI指向目的串, 源串放在DS段,目的串放在ES段 方向标志DF控制字符串的操作方向,DF为0,按递增方式调整,为1,按递减方式 53.字符串装入(LOAD String) LODSB : 装入字节 ==> (AL) <= ((SI)), (SI) <= (SI)+/- 1 LODSW : 装入字 ==> (AX) <= ((SI)), (SI) <= (SI)+/-2 MOV AL,[SI] INC SI ;DEC SI 此指令只把字符串的一个字符装一累加器中,不影响标志 54.字符串存储指令(STORE String) STOSB : 存储字节 ((DI)) <= (AL), (DI) <= (DI)+/-1 STOSW : 存储字 ((DI)) <= (AX), (DI) <=(DI)+/-2 MOV ES:[DI],AL INC DI ;DEC DI 55.字符串传送指令(MOVE String) ((DI)) <= ((SI)) MOVSB : 字节传送 (SI) => (SI)+/-1 (DI) =>(DI)+/-1 MOVSW : 字传送 (SI) => (SI)+/-2 (DI) =>(DI)+/-2 56.字符串扫描指令(SCAN String) SCASB : 串字节扫描 (AL)-((DI)), (DI) <= (DI) +/-1 SCASW : 串字扫描 (AX)-((DI)), (DI) <= (DI) +/-2 相减结果反映到各有关标志位(AF,CF,OF,PF,SF和ZF),不影响操作数 57.字符串比较指令(COMPARE String) ((SI)) - ((DI)) CMPSB : 字节传送 (SI) => (SI)+/-1 (DI) =>(DI)+/-1 CMPSW : 字传送 (SI) => (SI)+/-2 (DI) =>(DI)+/-2 影响标志位,不影响操作数 58.重复前缀REP 重复其后的串操作指令动作,每次先判断CX是否为0,为0就结束,否则CX值减1, 重复其后的串操作指令.不影响各标志 主要用在串指令MOVS和STOS之前 59.重复前缀REPZ/REPE 每重复一次,cx值减1,直到cx为0或零标志ZF为0时 主要用在串指令CMPS和SCAS之前 60.2008/6/5 重复前缀REPNZ / REPNE 每重复一次,cx值减1,直到cx为0或零标志ZF为1时 61.2008/6/6 组合的BCD加法调整指令 DAA (对AL的和(即必先由两个组合的BCD码相加后)的结果进行调整) (1) AL的低4位在A~F之间,或AF为1 ==>AL = AL+6,AF为1 (2) AL的高4位在A~F之间,或CF为1 ==>AL = AL + 60H, CF 为1 不影响OF位,影响其他位 组合的BCD减法调整指令 DAS (1) AL的低4位在A~F之间,或AF为1 ==>AL = AL-6,AF为1 (2)AL的高4位在A~F之间,或CF为1 ==>AL = AL - 60H, CF 为1 62.2008/6/9 未组合BCD码加法调整指令AAA (只结AF,CF位有影响) (1)AL的低4位在0~9间,且AF为0,则转到(3) (2)AL的低4位在A~F间,或AF为1,则AL <= (AL)+6 ,AH <= (AH)+1,且AF位置为1 (3)清除AL的高4位 (4)AF位的值送CF位 63. 未组合BCD码减法调整指令AAA (只结AF,CF位有影响) (1)AL的低4位在0~9间,且AF为0,则转到(3) (2)AL的低4位在A~F间,或AF为1,则AL <= (AL)-6 ,AH <= (AH)-1,且AF位置为1 (3)清除AL的高4位 (4)AF位的值送CF位 64.未组合BCD码乘法AAM 把AL中的值除以10,商放在AH中,余数放在AL中 65.未组合BCD码乘法AAD (影响SF,ZF,PF) 特别:应放在除运算之前 AL <= AH*10 + (AL) AH <= 0 调整为一个二进制数 66.DOS程序段前缀PSP 终止程序的另一个途径: A.4Ch系统功能调用终止程序,返回dos B. 20h中断处理程序终止程序的一个条件,之前,代码段寄存器cs必须含有PSP的段值 67.宏指令及其用法 宏定义的一般格式: 宏指令名 MACRO [形式参数表] ......(宏定义体) ENDM 宏指令的优先级最高,同名的指令或伪操作就失效 68.2008/6/11特殊的宏运算符
(1)强迫替换运算符& 若参数在其它字符的紧前或紧后,或参数在带引号的字符串中 (2)字符串原样传递运算符<> (3)文字字符运算符! 使用其后的一个字符只作为一般字符. (4)表达式运算符% 把其后表达式的结果作为实参替换,而非表达式自身 (5)在宏定义中,如果注释以两个分号引导,则在宏扩展中该注释不出现. 69.2008/6/11 (1)局部变量说明伪指令 (如果宏定义体中有语句标号,应在宏定义的下一句使用LOCAL) LOCAL 标号表 ( 标号由(??0000至??FFFF)替代 ) (2)清除宏定义的伪指令 PURGE 宏名表 (3)中止宏扩展的伪指令 EXITM 一般与条件伪指令一起使用, 以便规定的条件下跳出宏内的最后语句 如在嵌套宏内,则退出到外层宏 70.2008/6/12 重复汇编 重复块是允许建立重复语句的宏的一种特殊形式,与宏的不同是没有命名 1.REPT REPT 表达式(重复个数) 需要重复的语句组 ENDM 2.IRP (实参的个数决定了重复的次数,每次把实参代入形参) IRP 形式参数, <实参1,实参2,...实参3> 重复的语句 ENDM 3.IRPC ( 实参列表是个字符串,字符串的长度决定重复的次数,每次代入一个字符) IRPC 形式参数,字符串 重复的语句 ENDM (如果字符串含有空格,逗号等分隔符,字符串需用一对尖括号括起来) eg. IRPC REG , ABCD PUSH REG&X ENDM 71.条件汇编 IFXXXX 条件表达式 语句组1 [ELSE 语句组2] ENDIF IF,IFE, IFDEF,IFNDEF, IF1,IF2 IFB,IFNB IFIDN,IFDIF (后面都接) ENDIF 72. 2008/6/ 12 模块化程序设计 (1)段的完整定义 段名 SEGMENT [定位类型] [组合类型] ['类别'] 语句 段名 ENDS 定位类型:PARA(16),BYTE,WORD,DWORD(32),PAGE(256) 组合类型:PUBLIC,COMMON,STACK,MEMORY,AT表达式,PRIVATE(MASM不支持) 73.段的简化定义 (1)存储模型 .MODEL 存储模型 1. SMALL 全部数据限制在单个64K段内;全部代码也在单个64KB内,所有为段内转移 2.MEDIUM 全部数据限制在单个64K段内;代码可以>64KB. 3.COMPACT 数据>64K;全部代码也在单个64KB内. 4.LARGE 数据,代码都可超过64KB,但一个数组不能大于64K 5.HUGE 都可以大于64K 6.TINY 数据,代码,堆栈全在一个段 (2)堆栈段的伪指令 .STACK [大小] 默认是1024 (3)数据段的伪指令 .DATA (4)远程(独立)数据段的伪指令 .FARDATA 74.2008/6/13 模块间的通信 1.PUBLIC 标识符[,标识符...] 声明当前模块内定义的标识符是公共标识符,可供其他模块使用 2.EXTRN 标识符:类型 [,标识符:类型,...] 声明一个在其他模块内定义的标识符 类型 NEAR,FAR,BYTE,WORD,DWORD EXTRN在段内与段外有区别,在段内时,虽在其他模块,但却在同一个段内;如果在段外,则不知道在哪个段 ===================ASM应用_我是华丽的分割线_ASM应用======================== 1.LABEL 2008/6/13 label是类型指定指令,它可以为一个变量或一条指令设置不同的类型,以方便不同方式的访问. 如: foo_byte label byte foo_word dw 1234h mov ax,foo_word ;[ax]=1234h mov bl,foo_byte ;[bl]=34h 又如: sub_far label far sub_near proc near ;... sub_near endp call sub_near ;段内调用 call far ptr sub_far ;段间调用 2.把字串定义在代码段里,反汇编的时候会乱