190 likes | 338 Views
汇编语言复习. 要点与注意事项. 寄存器结构. 数据寄存器、指针和变址寄存器都可存放操作数,后者更多用于存放偏移量 段寄存器不可参与任何算术运算和逻辑运算,仅可在 MOV 、 PUSH 、 POP 指令中出现 段寄存器 DS 、 ES 、 SS 的值由用户加载, CS 由连接程序自动加载 SP 始终指示栈顶位置. 存储器结构 存储器以字节编址,采用分段结构 16 位数据如何存放? 物理地址如何计算? 数据定义语句 X DW 1234H 与 X DB 12H , 34H 有何区别?
E N D
汇编语言复习 要点与注意事项
寄存器结构 • 数据寄存器、指针和变址寄存器都可存放操作数,后者更多用于存放偏移量 • 段寄存器不可参与任何算术运算和逻辑运算,仅可在MOV、PUSH、POP指令中出现 • 段寄存器DS、ES、SS的值由用户加载,CS由连接程序自动加载 • SP始终指示栈顶位置
存储器结构 存储器以字节编址,采用分段结构 16位数据如何存放? 物理地址如何计算? 数据定义语句 X DW 1234H 与 X DB 12H,34H 有何区别? 34H 12H 12H 34H
寻址方式 • 立即寻址方式只能用于双操作数中的源操作数,不能用于单操作数 • 寄存器间接寻址方式只可用BX、SI、DI、BP • 一般按段默认情况计算物理地址,除非指定段跨越
指令系统 • 掌握每条指令的格式、功能、注意事项 • 双操作数指令中,源和目的不能同时为存储器操作数,即除源为立即数外,必须有一个寄存器 • 单操作数指令中,不允许为立即数 • 数据传送指令不影响标志位的值 • 可以以字或字节为单位操作
指令应用点滴(1) • MOV指令中,源和目的均为寄存器时,其长度应一致 • 十进制调整指令是对AL寄存器中的数进行调整 • 十进制调整指令,加、减、乘调整在运算之后,而除调整在运算之前 • 乘、除法指令是单操作数指令,另一操作数约定在AL(AX)中,结果也有约定 • 注意指令LEA与MOV的区别 • 有符号数比较和无符号数比较的区别
指令应用点滴(2) • 使用串操作指令时必须遵守相应的约定 • 当重复前缀与串操作指令结合使用时,注意退出循环时SI、DI的值 • 移位指令中,源操作数只能是1或CL(移位次数) • JMP、CALL均是无条件转移,但后者保存返回地址 • 条件转移指令的转移范围是-128到+127字节 • 用INT 21H指令实现数据的输入/输出
[例1] 指出下列指令的错误原因 (1) MOV BL, AX (2) MOV ES, 1850H (3) XOR [BX], [BX] (4) AND AX, [CX] 解: (1)源操作数和目的操作数长度不一致 (2)目的操作数是段寄存器时,源操作数不能为立即数 (3)不允许两个操作数均为存储器操作数 (4)寄存器间接寻址方式中不可使用CX
[例1] 指出下列指令的错误原因 (5)ADD AX, [BX][BP] (6)JZ LP[DI] (7)JMP WORD PTR LOOPS ; LOOPS是一标号 解: (5)寻址方式中不可同时使用BX和BP (6)条件转移指令中只可用目标地址,即标号 (7)无条件转移指令中属性应是NEAR或 FAR
[例2]写出三种不同的方法,使寄存器AX和BX 的内容交换, 要求不使用其他的寄存器。 解: (1)直接使用交换指令 XCHG AX, BX (2)通过一个存储单元交换 MOV TEMP, AX MOV AX, BX MOV BX, TEMP (3)利用堆栈实现交换 PUSH AX BX PUSH BX AX POP AX POP BX
[例3] 按下列要求写出相应的指令或指令序列 (1)用移位指令将-35乘以8的结果存入AX (2)段间以BX间接寻址的无条件转移指令 (3)清除以SI寄存器间接寻址的存储器字单元 (4)将一字节立即数0B6H与地址为NUM的存储器字节单元 内容比较 解: (1) MOV AX, -35 MOV CL, 3 SAL AX, CL (2) JMP DWORD PTR [BX] (3) MOV WORD PTR [SI], 0 (4) CMP NUM, 0B6H
源程序结构 • 源程序的书写格式 • 源程序中的常量要标明B、Q、H、D • 数据定义语句中的变量在存储器中的分配 • 数据定义语句中“$”的使用 • 运算符PTR用来改变变量的属性 • 运算符OFFSET返回变量在段内的偏移值 • 返回DOS的两种方法
[例4] 设数据定义如下: BUF1 DB 100 DUP(?) BUF2 DW 1275H,567,0C5H BUF3 DB 20 DUP(?) (1)用一条指令将BUF1的偏移地址送入BX (2)将BUF2的第三个字节数据送入CL (3)将0A6H送入BUF3的第10个字节单元中 解: (1) MOV BX, OFFSET BUF1 或 LEA BX, BUF1 (2) MOV CL, BYTE PTR BUF2+2 (3) MOV BUF3+9, 0A6H
汇编语言编程 1、分支结构只有一个出口,必须使用JMP指令 [例]CMP X, 0 JL L1 MOV AX, 1 JMP NEXT L1: MOV AX,-1 NEXT: 2、已知循环次数时常用减数控制法 MOV CX, N AGAIN: …... …... LOOP AGAIN Y X<0 AX=1 AX=-1
汇编语言应用 1、数制转换:二进数-->ASCII码(十、十六进制) ASCII码(十、十六进制)-->二进数 2、算术运算:二进数(有符号、无符号数) 十进数(压缩、非压缩BCD码) 多字节数 3、字符串操作:字符串移动 字符串比较 在已知字符串中查找某一字符 4、表格(数组)处理:查找(顺序查找、XLAT指令) 排序 插入 删除
[例5] 写出每条指令执行后的结果 MOV SI, 4 MOV BX, 0100H 数据段 MOV AX, 0050H DS 10000 MOV CX, [BX] INC BX INC BX 67 10100 ADD CX, [BX] 35 10101 MOV [BX][SI], CX 46 10102 MUL WORD PTR [BX][SI] 87 10103 A8 10104 6C 10105 (CX)=0BCADH (DX:AX)=003AF610H
[例6] 下列指令执行后AX中的值是什么? TABLE DW 10, 20, 30, 40 ENTRY DW 3 MOV BX, OFFSET TABLE ADD BX, ENTRY MOV AX, [BX] TABLE 0A +1 00 +2 14 +3 00 +4 1E +5 00 +6 28 +7 00 (AX)=1E00H
[例7]欲对数组A、B的相应元素作如下运算: I=1,2,5时,逻辑与运算 I=3,6,7时,逻辑或运算 I=4,8时,逻辑异或运算 将运算结果存入数组C 分析: 00——逻辑与运算 11——逻辑或运算 01或10——逻辑异或运算 DATA SEGMENT A DB 8 DUP(?) B DB 8 DUP(?) C DB 8 DUP(?) RELU DW 0111110001110000B DATA ENDS
MOV CX,8 __________ MOV BX,RELU MOV AX,A[SI] AGAIN: MOV DX,BX AND DX,03H ___________ JZ A_AND_B CMP DX,03H JZ A_OR_B XOR AX,B[SI] JMP DONE ___________ A_AND_B:AND AX,B[SI] JMP DONE A_OR_B: OR AX,B[SI] DONE: MOV C[SI],AX INC SI SHR BX,1 SHR BX,1 ________ LOOP AGAIN