汇编语言第四章

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

14
Exercise 4.1

对于如下问题的每部分,在给定的mov指令执行时, 假设已有执行“执行前”的值,给出该指令执行 “执行后”所需的值。
Before instruction xchg bx, cx After
(a) BX: FF 75
CX: 01 A2 (b) AX: 12 34
BX,CX
Basic Instructions
29
设计实现:




提示输入x的值; 将 x 从ASCII 转换成 二进制补码数; 表达式 := x; 提示输入y的值; 将 y 从ASCII 转换成 二进制补码数; 将 y加到表达式里,给出x+y 提示输入z的值; 将 z 从ASCII 转换成 二进制补码数; 计算 2*z (z + z); 将表达式减去2*z, 得到 x + y −2*z; 表达式加上, 得到 x + y −2*z + 1; 表达式取补, 得到 −(x + y −2*z + 1); 将结果从二进制数转换ASCII码; 显示结果;
Basic Instructions
9
时间效率& 空间效率
时间效率通常由执行程序的时间长 度来衡量,而这点取决于处理器执 行每一条指令所需要的时钟周期数。 空间效率涉及程序代码的大小,例 如,如果程序必须存储在Rom中, 小的可执行文件十分重要。

Basic Instructions
10
Basic Instructions
Add(add) 指令 Inc(increment) 指令 Sub(subtract) 指令 Dec (decrement) 指令 Neg (negate) 指令

add,sub,inc,dec和neg指令都会对eflags寄存器的标志位 进行更新。影响SF,ZF,OF,AF标志位的值。
11
Basic Instructions
12
Xchg 指令

xchg指令将两个不同地址的数据进行交换。 假设交换value1和value2的值,高级语言:
temp=value1; value1=value2;
value2=temp;
汇编语言 mov eax,value1
xchg eax,value2
mov Count,Number ;语句错误,两个操作数不 合法
Basic Instructions 4
mov指令中合法的操作数
immediate memory DS,ES,SS,FS,GS CS source destination registers
Basic Instructions
5
mov指令中不合法的操作数
标志寄存器的影响
指令有时会影响eflages寄存器中不同的标志 位。通常一条指令可能有如下3种影响: 标志位不改变 根据指令的执行结果对特定的标志位赋值 某些标志位可能被改变,但是它们的设置 无法预测

所有的 mov 指令,都不影响标志寄存器
Basic Instructions
8
Exercise

取反指令,单操作数。如果整数取反, 其结果为负数;对于负数取补其结果为 正数,而零仍然还是零。
Basic Instructions
26
Example
Basic Instructions
27
Example
Basic Instructions
28
Example

程序要求输入x,y,z三个数计算表达式 −(x + y −2z + 1)的值,并显示其结果。
Basic Instructions
19
Sub 指令

Form: sub dest, src Operation dest := dest - src
Subtract 目的操作数中整数减去源操作 数中的整数,相减的差取代目的操作数 中原来的值。
Basic Instructions
20
Inc & Dec 指令
BYTE cr,Lf,0
Basic Instructions 33
Program to evaluate(3-4)
.CODE ; start of main program code _start: output Prompt1 ; prompt for x input Value,16 ; read ASCII characters atoi Value ; convert to integer mov dx,ax ;x output Prompt2 input Value,16 atoi Value add dx,ax output Prompt3 input Value,16 atoi Value ; prompt for y ; read ASCII characters ; convert to integer ;x+y ; prompt for z ; read ASCII characters ; convert to integer
AX
xchg
al, ah
(c) EBX: 00003A4C
Temp: DWORD -1
xchg
Temp, ebx
EBX, Temp
Basic Instructions
15
本章内容
复制数据指令
整数的加法和减法指令
乘法指令
除法指令
大数的加减
Basic Instructions
16
4.2 整数的加法和减法指令
mov value1, eax
2个时钟周期, 5个字节 等价于
mov ecx,eax mov eax,value2 mov value2,ecx
3个时钟周期, 12个字节
Basic Instructions
13
Exercise 4.1

对于如下问题的每部分,在给定的mov指令执行时, 假设已有执行“执行前”的值,给出该指令执行 “执行后”所需的值。
第四章 基本指令
上章知识点回顾
汇编语句 一个完整的实例 程序的汇编、连接和运行 常数操作数 指令中的操作数 IO.H宏的输入和输出

பைடு நூலகம்
Basic Instructions
2
本章内容
复制数据指令
整数的加法和减法指令
乘法指令
除法指令
Basic Instructions
inc(加)和sub(减)指令有特定用途, 通常1 作为默认的源操作数. 形式:

inc dest Operation: dest := dest + 1 dec dest Operation: dest := dest - 1
Basic Instructions
21
Inc & Dec 指令
Before instruction mov bx, cx After
(a) BX: FF 75
CX: 01 A2 (b) AL: 64
BX,CX
AL
mov
al, -1
(c) EBX: 00003A4C
Value: DWORD -1
mov
Value, ebx
EBX, Value
Basic Instructions
31
Program to evaluate(1-4)
; program to input values for x, y and z ; and evaluate the expression - (x + y - 2z + 1) ; author: R. Detmer ; date: revised 8/97 .386 .MODEL FLAT ExitProcess PROTO NEAR32 stdcall, dwExitCode:DWORD include io.h cr equ 0dh Lf equ 0ah ; header file for input/output ; carriage return character ; line feed
源操作数和目的操作数都在存储器中 的数据传送 源操作数为立即数,目的操作数为段 寄存器 源操作数和目的操作数都是标志寄存 器 任何向指令指针寄存器的数据传送 一个段寄存器到另一个段寄存器的数 据传送 一个数据传送多个对象

Basic Instructions 6
mov Count,Number;非法 可以替换为: mov eax, Number mov Count,eax 如果希望全部四个双字长数据从源地址复制到目的地址 源地址和目的地址的声明如下: source dword 1,2,3,4 dest dword 4 dup (?) 所需操作如下: mov eax,source ;复制第一个双字 mov dest,eax mov eax,source+4 ;复制第二个双字 mov dest+4,eax mov eax,source+8 ;复制第三个双字 mov dest+8,eax mov eax,source+12 ;复制第四个双字 mov dest+12,eax

inc和dec指令,把目的操作数看作无 符号整数,就像加减指令一样,运算 结果将影响OF,SF和ZF标志位,但 是不会改变进位标志位CF。
Basic Instructions
22
Example
Basic Instructions
23
Example
Basic Instructions
24
Efficiency of inc & dec(1-2)

对于加1和减1的操作使用inc和dec指 令效率更高,所需时钟周期和存储空 间的字节数都较加法和减法指令要少。
优于
inc ecx
add ecx,1
dec ecx
优于
sub ecx,1
Basic Instructions
25
Neg instruction
Form : neg dest Operation dest := - dest
Basic Instructions 30
设计寄存器和变量
x, y, z 不需要存储在内存中 假设所需要的整数不是很大,用字长 来存储 使用AX计算速度更快,所以表达式的 值放在累加器ax,但是atoi用ax作为 目的操作数,所以在运算中不在使用 ax寄存器,可以使用其通用寄存器

Basic Instructions
Basic Instructions 17
Add 指令

Form : add dest, src

Operation dest := dest + src
Add 源操作数中的整数和目的操作数中 整数相加,相加的和将取代目的操作数 中原来的值。
Basic Instructions
18
Example
3
4.1 复制数据指令

Mov指令格式 mov 目的操作数,源操作数 从源操作数地址把一个字节、字或双字复制到目的操作数地 址,存储在源地址中值不会改变。目的地址要求与源地址大 小一致。与高级语言中的赋值语句十分相似。
Count=Number
汇编语言:
mov ecx,Number
mov Cout,ecx
.STACK 4096
; reserve 4096-byte stack
Basic Instructions 32
Program to evaluate(2-4)
.DATA ; reserve storage for data Prompt1 BYTE "This program will evaluate the " BYTE " expression",cr,Lf,Lf BYTE " - (x + y - 2z + 1)",cr,Lf,Lf BYTE "for your choice of integer values.",cr,Lf,Lf
BYTE "Enter value for x: ",0
Prompt2 BYTE "Enter value for y: ",0 Prompt3 BYTE "Enter value for z: ",0
Value
Result
BYTE 16 DUP (?)
BYTE 6 DUP (?)
Answer BYTE cr,Lf,"The result is "
指出哪些是不合法的指令
MOV EAX,BL MOV CS,AX × 两个寄存器位数不匹配 × 往代码段寄存器送数据
MOV [ESI],[EBX] × 源、目的操作数都在内存
MOV AH,2589H MOV ES,DS MOV DS,3542H MOV 5, AH × 两操作数位数不匹配 × 两操作数都是段寄存器 × 立即数往段寄存器送数据 × 目的操作数为立即数
相关文档
最新文档