760 likes | 903 Views
Review. 050907. 汇编语言优点: 直接控制底层硬件 时间、空间效率最高 汇编语言优缺点: 与处理器密切相关 与硬件细节密切相关 编写繁琐,调试、维护、交流和移植困难. 050907. 汇编语言程序员面对的系统构成: 寄存器 内存地址:小端方式(低地址低字节) 逻辑地址:段基址:段内偏移量 物理地址=段基址 ×10H +段内偏移量 段跨越前缀 外设端口地址: 16 位。. 050907. 050907. 050907. 相关软件: DOS ( Windows 下虚拟实模式) 文本编辑软件 Masm :汇编程序 Link :连接程序
E N D
050907 • 汇编语言优点: • 直接控制底层硬件 • 时间、空间效率最高 • 汇编语言优缺点: • 与处理器密切相关 • 与硬件细节密切相关 • 编写繁琐,调试、维护、交流和移植困难
050907 • 汇编语言程序员面对的系统构成: • 寄存器 • 内存地址:小端方式(低地址低字节) • 逻辑地址:段基址:段内偏移量 • 物理地址=段基址×10H+段内偏移量 • 段跨越前缀 • 外设端口地址:16位。
050907 • 相关软件: • DOS(Windows下虚拟实模式) • 文本编辑软件 • Masm:汇编程序 • Link:连接程序 • Debug:调试程序 • 功能调用: • DOS功能调用 • BIOS功能调用
050912 • 数据相关寻址方式: • 不在内存: • 立即 • 寄存器 • 内存中:与位移量、基址、变址、比例因子 • 直接 • 寄存器间接 • 寄存器相对 • 基址变址 • 相对基址变址 • 比例变址
050912 • 指令相关寻址方式:段内、外,直接、间接 • 段内直接:CS不变、IP←IP+位移量 • 可加NEAR PTR或SHORT运算符 • 段内间接:CS不变、IP←间接地址(r/m) • 当m时,加WORD PTR运算符,可使用数据相关寻址方式确定。 • 段间直接:CS←目标段地址、IP←目标偏移地址 • CS:IP在指令中,加FAR PTR运算符。 • 段间间接: CS←目标段地址、IP←目标偏移地址 • 此时目标地址一定在内存中,加DWORD PTR运算符,具体地址由数据相关寻址方式确定。
050912 • 机器语言指令形式: • d:是目的?双操作数中指定寄存器位置。 • w:是字? • s:符号扩展? • 机器语言中寻址方式表示 • mod:2位,四种组合 • reg:3位,八种组合,表8个字/字节寄存器 • r/m:3位。见表3.4 • r:表8个字/字节寄存器 • m: 表8种寻址方式
050912 • 加法指令:ADD DST,SRC • 当目标寄存器是AC时可节省一个字节 • 指令执行时间:表3.6、3.7、3.8 • 乘除指令最长 • 目标是内存单元时可能两次访存 • 寻址方式不同,时间不同 • 32位指令简介:略(参见《计算机原理》及本教材)
050914 • 作业:P124 • 3.4 • 3.8(奇数小题) • 下周一交
050914 • 指令系统: • 数据传送 • 算术 • 逻辑 • 串处理 • 控制转移 • 处理机控制与杂项操作
050914 • 数据传送指令:五类 • 通用传送 • mov dst,src • push/pop • xchg opr1,opr2 • 累加器专用传送 • in/out • xlat • 地址传送 • lea reg,src • lds/les/lss reg,src
050919 • 标志寄存器传送指令 • LAHF/SAHF • PUSHF/POPF • 类型转换指令 • CBW/CWD • 算术运算指令:关键在标志位 • ADD/ADC/INC • SUB/SBB/DEC/借位的产生
050921 • 作业:P125 • 3.15 ⑴、⑶(写出算式) • 3.16 ⑴、⑶(写出算式,4AE0H作被减数) • 3.17 ⑴、⑶ • 下周一交
050921 • 作业: 3.4 ⑴、mov ax,1200H 立即数,几乎没有错的。 (ax) =1200H ⑵、mov ax,bx 皆是寄存器寻址。 (ax)= (bx)=0100H ⑶、mov ax,[1200] 物理地址=ds*10H+1200H=21200H 注意必须是相邻两单元的内容。所以 (ax)=(21201,21200H)=4c2aH
050921 ⑷、mov ax,[bx] 物理地址=ds*10H+(bx)=20000H+0100H=20100H (ax)=(20101,20100H)=3412H ⑸、mov ax,1100[bx] 算出物理地址同⑶,故ax=4c2aH ⑹、mov ax,[bx][si] 物理地址=ds*10H+(bx)+(si)=20000H+0100H+2 =20102H (ax)=(20103,20102H)=7856H 有不少错为65B7H
050921 • ⑺、mov ax,1100[bx][si] • 物理地址=ds*10H+1100H+(bx)+(si) • =21202H • (ax)=(21203,21202H)=65B7H • 后面4小题有不少只有8位结果、或高位全0。
050921 • 3.8 • ⑴、mov ax,0ABH ;立即寻址 • ⑶、mov ax,[100H];直接寻址,20100H • ⑸、mov ax,[bx];寄存器间接或基址,20100H • ⑺、mov ax,[bp];寄存器间接或基址,15010H • 此处错误较多,错用ds而非ss,切记默认配对。 • ⑼、mov ax,[bx+10];相对基址,20110H • ⑾、mov ax,[bx][si];基址变址,201A0H
050921 • Dec:相当于--运算符 • Neg;求补或求反,有可能溢出、只有对0运算时cf=0,其余cf=1(有借位) • Cmp:仅比较,不改变被减数。主要通过标志位反映结果特征。 • Mul/imul:(ax)←(al)*(src) • (dx,ax) ←(ax)*(src) • Div/idiv: • (al) ←(ax)/(src)的商,(ah) ←(ax)/(src)的余数 • (ax) ←(dx,ax)/(src)的商,(dx) ←(dx,ax)/(src)的余数
050921 • 压缩BCD码调整: • Daa • das • 非压缩BCD码调整: • Aaa:调整al,但ah有微调(进位) • Aas:调整al,但ah有微调(进位)
050926 • 非压缩BCD调整 • AAM:乘后调整 • AAD:乘前调整 • 逻辑运算 • AND • OR • NOT • XOR • TEST
050926 • 移位指令: • SHL/SAL • SHR • SAR • ROL • ROR • RCL • RCR
050926 • 串处理指令:关键在于准备工作 • MOVS • CMPS • SCAS • LODS • STOS • INS • OUTS • REP
050928 • 控制转移指令 • 无条件转移: • 段内短转移 • 段内直接转移 • 段内间接转移:可在寄存器中,一般在内存 • 段间直接转移:指令中4/6字节直接地址 • 段间间接转移:间接地址在内存单元
050928 • 条件转移:都是短转移,-126~+129 • 单条件转移:针对五个标志位 • ①、 JZ/JE OPR ZF=1转移 • ② 、JNZ/JNE OPR ZF=0转移 • ③ 、JS OPR SF=1转移 • ④ 、JNS OPR SF=0转移 • ⑤、 JO OPR OF=1转移 • ⑥ 、JNO OPR OF=0转移 • ⑦ 、JP/JPE OPR PF=1转移 • ⑧、 JNP/JPO OPR PF=0转移 • ⑨、 JC OPR CF=1转移 • ⑩、JNC OPR CF=0转移
050928 • 无符号数比较:above/below,主要从有没有借位区分。 • ①、 JB/JNAE/JC OPR ;cf=1,x<y转移 • ②、 JAE/JNB/JNC OPR ;cf=0,x>=y转移 • ③ 、JBE/JNA OPR ;cf v zf=1,x<=y转移 • ④、 JA/JNBE OPR ;cf v zf=0,x>y转移
050928 • 符号数比较:用great/less表示,主要通过of和sf比较大小。 • 没有溢出时用sf即可,但溢出时sf不能表示真实的大小情况。 ⑴ JL/JNGE OPR ; sf⊕of=1,x<y转移 ⑵ JNL/JGE OPR ; sf⊕of=0,x>=y转移 ⑶ JLE/JNG OPR ; (sf⊕of) v zf=1,x<=y转移 ⑷ JNLE/JG OPR ;(sv⊕of) v zf=0,x>y转移
051010 • 作业:p127开始。 3.27 求bx值。 3.32 奇数小题 3.40 3.53 下周一交 其它习题自己一定得多动手练习!!!
051010 • 作业3.15 ⑴、 6 2 a 0 + 1 2 3 4 7 4 d 4 oszc=0000 ⑶、 6 2 a 0 + c f a 0 1 3 2 4 0 oszc=0001
051010 3.16 ⑴、 4ae0-1234 即: 4 a e 0 + e d c c 1 3 8 a c oszc=0000 或: 1234-4ae0 即: 1 2 3 4 + b 5 2 0 0 c 7 5 4 oszc=0101 两个正数相减不会有溢出。 减数求补(有人用反码)后相加。 加法进位求反作为CF;最高位进位、次高位进位异或送OF
051010 ⑶、 4ae0-9090 即: 4 a e 0 + 6 f 7 0 0 b a 5 0 oszc=1101 或: 9090-4ae0 即: 9 0 9 0 + b 5 2 0 1 4 5 b 0 oszc=1000 不管是正数减负数还是负数减正数,都可能溢出。
051010 • 3.17 • ⑴、Z← W+(Z-X) • mov ax,z ;变量名可不用“[ ]“ • sub ax,x ;决不能用sbb • add ax,w ;决不能用adc • mov z,ax ;有忘了送结果的。 • 有使用das等调整指令的。 • 有使用字节的。 • 甚至有使用双字的(当然没错)。 • 有两个操作数之间用其它符合分隔的。
3.17_(3)、Z←(W*X)/(Y+6) • mov bx,y ;有使用ax加后送bx,有必要吗? • add bx,6 ;bx←y+6 • mov ax,w • imul x ;dx、ax←w*x • idiv bx ; “idiv y+6”,对不对?为什么? • mov z,ax ;z←ax← (W*X)/(Y+6)的商 • mov r,dx ;r←ax← (W*X)/(Y+6)的余数 • 有使用“add y,6;idiv y”的,有什么问题?
051010 • 条件设置指令: • 循环指令: • Loop:单出口 • loopz/loope/loopnz/loopne:两出口 • 子程序调用call: • 段内直接 • 段内间接 • 段间直接 • 段间间接 • 子程序返回ret:对应有段间、段内返回。要注意的是带立即数形式。因为堆栈一定要保证其平衡。
051010 • 中断: • 中断向量:入口地址,中断号×4 • Int type • Into • Iret、iretd • 标志处理指令 • Clc/cmc/stc • Cld/std • Cli/sti
051010 • 其它杂项指令: • Nop • Hlt • Esc ;486起作为未定义指令,产生异常。 • Wait • Lock • bound • Enter:建立堆栈帧 • Leave:释放堆栈帧
051012 • 汇编程序功能: • 检查源程序错误 • 产生lst文件 • 展开宏指令 • 常见伪操作 • 处理器选择 • 完整段定义 • 定位类型 • 组合类型 • 使用类型 • 类别
051012 • 存储模型: • Tiny • Small • Medium:多个代码段 • Compact:多个数据段 • Large:代码段、数据段都可以多个 • Huge:同上且数据段可大于64K • Flat:保护模式下编程。 • 简化段定义:
051012 • 段组定义伪指令 • 格式: • grpname GROUP segname[,segname…] • 开始 • 格式:NAME module_name • 格式:TITLE text • 或者以文件名作模块名
051012 • 结束 • 格式:END [label] • 入口点(masm6.0及以上) • 格式:.STARTUP • 出口点 • 格式:.EXIT [return_value]
051012 • 数据定义及存储区分配伪指令 • 格式:[变量] 助记符 操作数 [;注释] • DB 1个字节 字节变量 • DW 2个字节(1个字) 字变量 • DD 4个字节(双字) 双字变量 • DF(386以上CPU)3字单元 三字变量 • DQ 4字单元 四字变量。 • DT 10个字节单元 十字节变量 • repeat_count dup(operand,…,operand
051012 • 修改属性 • 格式: • type PTR variable±constant expression
051017 关于上机: 1、时间:8周星期3(10月19日)78节 2、地点:信息楼6楼专业机房 3、实验内容:汇编环境、DEBUG、顺序结构 4、工具:masm5.0(尽量备U盘自带) 5、交实验报告。 6、要考勤。
051017 • 修改属性 • variable/label_name label type • 表达式赋值伪指令 • <符号名> EQU <表达式> • PURGE <符号1,符号2,…,符号n> • = • 地址计数器 • $ ±constant expression • 对准伪指令 • org constant expression
051017 • 对齐 • EVEN • ALIGN boundary • 基数控制伪指令 • .radix expression • 语句组成 • [标号:] 硬指令助记符 操作数,操作数 [ ;注释 • [变量] 伪指令助记符 参数,参数,… [;注释]
051017 • 名字项 • 标号:指令位置(逻辑地址)的标识符,后跟冒号 • 变量:伪指令位置(逻辑地址)和属性的标识符,无冒号 • 标识符(Identifier)一般最多由31个字母、数字及规定的特殊符号(如 _、$、?、@)组成,不能以数字开头。 • 操作项 • 含指令、伪指令、宏指令 • 操作数项 • 指令: • 伪指令: • 注释项:写好注释和编出程序同等重要
051017 • 表达式
051017 • 数值回送符 • type expression/label • length variable • size variable • offset variable/label • seg variable/label
051017 • 属性运算符: • ptr:type ptr expression • 段运算符:段前缀指定某段的地址属性。 • 段寄存器:地址表达式 • 段名:地址表达式 • 段组名:地址表达式 • Short:修饰转向地址的属性。 • This:this attribute/type • High/low • Highword/lowword • 运算符优先级:常见运算符运算顺序要熟记