
8086处理器访问存储器时都是以字为单位进行的,也就是说,机器是以偶地址访问存储器的。这样,对于奇地址的字单元,要取一个字需要访问二次存储器,这就需要花费较多的时间。
在8086微处理器中,在描述存储器地址时有三个相关的术语:物理地址、偏移地址和逻辑地址。
物理地址是由8086的地址引线送出的20位地址码。这20位地址码送到存储器经过译码,最终选定一个存储单元进行读/写。物理地址可写成5位的十六进制数。
偏移地址是相对于某段首地址的段内偏移量,用16位二进制代码表示,写成4位十六进制数,例如:004AH。
逻辑地址是在程序中对存储器地址的一种表示方法,由某段的段地址和段内偏移地址组成。写成:段地址 : 偏移地址
例如:2000H : 0080H
对存储器寻址起作用的是物理地址,8086对外有20位地址线,因此,存储器的可寻址范围为220=1MB。但是8086微处理器的内部结构是16位的,用户可用的寄存器也都是16位的。显然用16位的地址码无法寻址1MB的存储空间,为了解决这一矛盾,8086采用了分段的方法对存储器进行管理。
存储器地址分段的具体做法是:把1MB的存储器空间分成若干段,每段的容量最大64KB,这样段内地址就可以用16位来表示。实际上,可以根据编程的需要来确定段的大小,它可以是64K字节范围内的任意多个字节。
8086规定:从0地址开始,每16个字节为一小段,段的起始地址必须从任一小段(paragraph)的首地址开始,也就是说,段地址表示成20位的二进制地址码,其最低4位必须是"0"。
存储器采用分段管理后,每个段的首地址(称为段基地址或段地址)保存在8086内部的CS、DS、SS和ES四个16位的寄存器中,我们可以对段寄存器设置不同的值以指向不同的段。
16位的段地址和16位的偏移地址组合形成20位的物理地址,这就是8086的工作方式,这在80x86的寻址模式中称为实模式。
励磁电流: (恒定 )
发电机在怠速以上都是自励,与发动机转速无关。
发电机输出电流: (变小)
输出电流与转速是成正比的,这个你只要看一下电流表就明白了。
发电机输出电压: (恒定)
发电机在结构一定及磁场强度不变的条件下,其输出电压大小与发电机的转速成正比,理论上来说电压是变小的,但是为了保证整个汽车电气系统的正常工作和延长汽车电气设备的使用寿命,汽车上都安装有电压调节器。电压调节器使发电机输出电压值保持在某一特定范围内,且能随发电机转速的变化而自动调节。所以输出电压可以视为恒定。
用汇编写吗
code segmentassume cs:codestart: mov ax,code mov ds,axlea dx,mesmov ah,9int 21h xor ax,ax mov cx,100 add ax,cx loop $-2;当前地址减去2就是上一条指令xor cx,cxmov bx,10Q0:xor dx,dxdiv bxor dx,0e30hinc cxpush dxcmp ax,0jnz Q0Q1:pop axint 10hloop Q1mov ah,1int 21h mov ah,4ch int 21hmes db '1+2+3+4++100=$'code endsend start
MOV CX,200 ;CX=200,给出REP的循环次数
MOV SI, OFFSET STR1 ;STR1的偏移地址给SI,源偏移地址
LEA DI,STR2 ;DI,目的偏移地址装入有效STR2地址
CLD ;DF=0地址按增加方向变化
REPMOVSB ;200次源地址到目的地址的字节转移
1、这段程序完成什么功能? 200字节的STR1到STR2的转移(传送,复制)
2、REP和MOVSB哪条先执行? MOVSB先 *** 作,然后CX-1,判断CX=0?执行REP
3、REP执行时,完成什么 *** 作 CX-1
4、执行时,MOVSB完成什么 *** 作? 串转移,并且SI+1,DI+1
问题二、X/Y/Z均为16位带符号数,请编写一段程序段计算表达式(XY+Z-1000)/70的值
就是带符号数的四则运算,注意1616位就是32位,高16位是在DX中,低16位是在AX中,然后有符号数的乘法是IMUL,除法是IDIV;还有低位ADD后高位运算注意进位用ADC,减法也一样。整个运算只要不溢出就没问题
问题三、已知两个字符有符号数,存放在数据段shu开始的地址单元,如果两个数同号,求其差,否则这求其和。
应该是2个字节的有符号数吧。。。
LEA SI,shu
MOV AX,[SI]
PUSH AX
AND AX,80H
MOV BX,[SI+1]
PUSH BX
AND BX,80H
XOR AX,BX
JZ SUBSTACT
ADDITION: POP BX
POP AX
SUB AX,BX
HTL
SUBTRACT: POP BX
POP AX
ADD AX,BX
HTL
您可以使用以下代码实现这个需求:
#include <stdioh>
int main()
{
// 定义数组长度
int len;
// 从键盘输入数组长度
printf("请输入成绩的个数:");
scanf("%d", &len);
// 定义数组
int a[len];
// 循环读取成绩
for (int i = 0; i < len; i++) {
printf("请输入第 %d 个成绩:", i + 1);
scanf("%d", &a[i]);
}
// 计算成绩的最大值、最小值和平均值
int max = a[0];
int min = a[0];
int sum = 0;
for (int i = 0; i < len; i++) {
max = a[i] > max a[i] : max;
min = a[i] < min a[i] : min;
sum += a[i];
}
int avg = sum / len;
// 输出成绩个数和成绩的最大值、最小值、平均值
printf("成绩个数:%d\n", len);
printf("成绩的最大值:%d\n", max);
printf("成绩的最小值:%d\n", min);
printf("成绩的平均值:%d\n", avg);
return 0;
}
MOV CX, 05
MOV BL, 01
LP1: MOV DL, BL
OR DL, 30H //相当于加48
INC BL //BL从1到5
MOV AH, 02H
INT 21H
LOOP LP1
HTL
//这个代码应该是通过DOS功能调用显示 1 2 3 4 5
//DL放ASCII码 这里相当于放的 49 50 51 52 53
//AH放功能号02(02号功能就是显示字符) 通过int 21h调用
; 本程序通过编译,运行正确
Code Segment
Assume CS:Code,DS:Code
; -----------------------------------------
; 功能:显示指定地址(Str_Addr)的字符串
; 入口:
; Str_Addr=字符串地址(要求在数据段)
; 用法: Output Str_Addr
; 用法举例:Output PromptStr
Output MACRO Str_Addr
lea dx,Str_Addr
mov ah,9
int 21h
EndM
; -----------------------------------------
; 功能:输出一个字符
; 入口:dl=要显示的字符
enter_Chr proc Near
push ax
mov ah,02h
int 21h
pop ax
ret
enter_Chr endp
; -----------------------------------------
; 功能:从键盘输入N位数字
; 入口:N=数字位数;di=保存输入的数字首地址
Input_Digit Proc Near
push cx
push di
cld
mov cx,N
@@Input: mov ah,1
int 21h
cmp al,'0'
jb @@Input
cmp al,'9'
ja @@Input
stosb
loop @@Input
pop cx
pop di
ret
Input_Digit EndP
; -----------------------------------------
; 对数组元素无符号降序排序
Bubbling Proc Near
PUSH AX
PUSH CX
PUSH SI
PUSH DI
CLD
MOV CX,Elements ;外循环次数
@@Scanning: PUSH CX ;入栈保存外循环次数
LEA SI,Number ;数组首地址装入源变址寄存器
@@Compare: PUSH SI
POP DI ;当前数组元素地址赋给目的变址寄存器,以备交换之用
LODSB ;将当前数组元素读入AL
CMP AL,[SI] ;当前数组元素与相邻的下一个数组元素相比较
JAE @@NextOne ;若大于或等于,不作数据交换,处理下一个数组元素
XCHG AL,[SI] ;若小于,交换数组元素
STOSB ;保存数值较大者
@@NextOne: LOOP @@Compare ;处理下一个数组元素
POP CX ;外循环次数出栈
LOOP @@Scanning ;下一趟比较
POP DI
POP SI
POP CX
POP AX
RET
Bubbling EndP
; -----------------------------------------
N equ 7
PromptStr db 'Please Enter ',N or 30h,' digitals: $'
Max_Num db 13,10,13,10,'The maximum is $'
Mix_Num db 13,10,13,10,'The miximum is $'
Mid_Num db 13,10,13,10,'The midoule is $'
Number db N dup()
Elements EQU ($-Number)/Type Number-1 ; 外循环次数
Start: push cs
pop ds
push cs
pop es ;使数据段、附加段与代码段同段
Output PromptStr ;提示输入7个数字
lea di,Number ;数字存放地址
call Input_Digit ;从键盘接受指定位数的数字
call Bubbling ;无符号数降序排序
Output Max_Num ;最大值
mov dl,Number ;取最大值
call enter_Chr ;显示最大值
Output Mix_Num ;最小值
mov dl,Number[6] ;取最小值
call enter_Chr ;显示最小值
Output Mid_Num ;中值
mov dl,Number[3] ;取中值
call enter_Chr ;显示中值
Exit_Proc: mov ah,4ch ;结束程序
int 21h
Code ENDS
END Start ;编译到此结束
以上就是关于下面这个微机原理怎么做全部的内容,包括:下面这个微机原理怎么做、微机原理程序,急求大家帮我解释一下,添点注释,谢谢、用微机原理 编写程序1+2+3+4+5+6+……+100..等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)