您的位置:首页 > 其它

在8086模拟器中运行汇编求平均值程序

2016-06-10 16:43 597 查看
DATA1 SEGMENT
data DW 90, 95, 54, 65, 36, 78, 66, 0, 99, 50, -1
Average DW 0
DATA1 ENDS
CODE1 SEGMENT
ASSUME CS:CODE1, DS:DATA1
START: MOV AX, DATA1
MOV DS, AX
XOR AX, AX
XOR DX, DX ;用(DX,AX)来保存数组元素之和
XOR CX, CX ;用CX来保存数组元素个数
LEA SI, data ;用指针SI来访问整个数组
again: MOV BX, word ptr [SI]
CMP BX, 0
JL over
ADD AX, BX
ADC DX, 0 ;把当前数组元素之值加到(DX,AX)中
INC CX ;数组元素个数加1
ADD SI, 2
JMP again
over: JCXZ exit ;防止零作除数,即数组是空数组
DIV CX
MOV Average, AX
exit: MOV AX, 4C00H
INT 21H
CODE1 ENDS
END START


score的平均整数,并存入内存字变量Average中,数组以-1为结束标志。

 xor eax,eax

 是异或运算,两数相反为1;两数相同为0。由于这两个数相同,异或后等于清0 ;由于它比mov eax,0效率高,所以一般用它。

LEA 取有效地址指令 (Load Effective Address )

取源操作数地址的偏移量,并把它传送到目的操作数所在的单元。

下面两条指令就是等价的,他们都取TABLE的偏移地址,然后送到BX中,即

LEA BX,TABLE

MOV BX,OFFSET TABLE

带进位加法指令 ADC(Addition Carry)

格式

ADC OPRD1,OPRD2

功能

OPRD1<--OPRD1 + OPRD2 + CF

说明

1. OPRD1为任一通用寄存器或存储器操作数,可以是任意一个通用寄存器,而且还可以是任意一个存储器操作数.

OPRD2为立即数,也可以是任意一个通用寄存器操作数.立即数只能用于源操作数.

2. OPRD1和OPRD2均为寄存器是允许的,一个为寄存器而另一个为存储器也是允许的,但不允许两个都是存储器操作数.

3. 加法指令运算的结果对CF、SF、OF、PF、ZF、AF都会有影响.以上标志也称为结果标志.

4. 该指令对标志位的影响同ADD指令.

div是除法指令,使用div做除法的时候应注意以下问题:

1、除数:有8位和16位两种,在一个寄存器或者内存中。

2、被除数:默认放在AX或(DX和AX)中,如果除数为8位,被除数为16位,被除数默认在AX中存放,如果除数为16位,被除数为32位,被  除数则在(DX和AX)中存放,DX存放高16位,AX存放低16位。

3、结果:如果除数是8位,则AL存储除法操作的商,AH存储除法操作的余数;如果除数是16位,则AX存储除法操作的商,DX存储除法操作的余数。

格式如下:

div reg

div 内存单元

以100001/100为例,100001大于65535,所以只能用dx和ax两个寄存器联合存放100001,也就是说要进行16位的除法。除数100小于255,可以在一个8位的寄存器中存放,但是被除数是32位的,除数应为16位,所以要使用一个16位的寄存器来存放除数100.

dx和ax分别存放100001的高16位和低16位值,所以将100001表示为16进制的形式:186a1h.

data1段的地址被编译为00710h,10个数据被放入此;但是为什么在模拟器中此地址出现在栈的模拟中;



0710被放入DS寄存器;SI目前是0;



第一个数被放入BX中;over标号编译后的地址为020h;



第一个数加完,AX为5A(10进制的90);



看BX是否为0;



加完一个数,CX为1;



SI指向下一个数;again编译后的地址为0Eh;



累加;结果在AX中;



加完,看CX为10,AX为0279h=10进制的633;



看前面图,在整个过程中进位标志CF一直未变;

看变量窗口,除完后的结果为003Fh,此结果不包括余数;

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息