求大神帮忙编一下 用8086CPU的8086汇编语言编译器

1.3 ---- 汇编语言的组成 汇编语言由以下三类组成: 1、汇编指令(机器码的助记符,能够直接翻译成机器码) 2、伪指令(由编译器执行,没有对应的机器码,CPU不能识别) 3、其它符号(例如:+ - * /,由编译器执行,CPU不能识别) 小知识:CPU不认识加减乘除,它内部有一个逻辑运算单元,认识的运算是逻辑运算(与 或 非) 对于伪指令和其它符号,编译器会将其翻译成cpu能够识别的二进制代
1.8 ---- 地址总线 地址总线上能传送多少不同的信息,CPU就可以对多少个存储单元进行寻址。 小知识:我们常说,32位CPU或者64位CPU,多少位指的就是CPU的寻址能力,也就是地址总线的线数,64位CPU就是64条地址总线。 64位的CPU + 64位的操作系统 + 64位的软件 = 64位的速度,缺一不可。 64位就是64bit,也就是8Byte 下图表示了地址总线发送地址: 一个CP
1、汇编指令是机器指令的助记符,同机器指令一一对应。 2、每一种CPU都有自己的汇编指令集。 3、CPU可以直接使用的信息在内存储器中存放。 4、在存储器中指令和数据没有任何区别,都是二进制信息。 5、存储单元从零开始顺序编号。 6、一个存储单元可以存储8个bit(用作单位写成“b”),即8位二进制数。 7、每一个CPU芯片都有许多管脚,这些管脚和总线相连,也可以说,这些管脚引出总线。一个CPU可
1、 13位 2、23 3、1024 * 8、^30、2^20、2^10 5、64、1、16、4 6、1、1、2、2、4 7、512、256 8、二进制数
计算机系统中,所有可用程序控制其工作的设备,必须受到CPU的控制。 CPU对外部设备不能直接控制,如显示器、音响、打印机等,直接控制这些设备进行工作的是插在扩展插槽上的接口卡(例如)。 然后CPU通过直接控制这些接口卡来间接控制这些外部设备,例如CPU通过控制显卡来间接控制显示器,通过控制声卡来间接控制音响,通过控制USB来间接控制打印机。
内存储器的分类 从读写属性上看,分为两类:随机存储器
一个典型的CPU由运算器、控制器、寄存器等器件组成,这些器件靠内部总线相连。 区别: 内部总线实现CPU内部各个器件之间的联系。 外部总线实现CPU和主板上其它器件的联系。
8086CPU有14个寄存器 它们的名称为: AX
8086CPU所有的寄存器都是16位的,可以存放两个字节。
一个字可以存在一个16位寄存器中,这个字的高位字节和低位字节自然就存在这个寄存器的高八位寄存器和低八位寄存器中。 在以后的课程中,为了区分不同的进制,在十六进制表示的数据的后面加H(hexadecimal),在二进制表示的数据后面加B(binary),十进制表示的数据后面什么也不加。
几条汇编指令
1、通常情况下都是:操作指令
目的数或目的地址,
源操作数或源地址 2、汇编指令不区分大
F4A3H 31A3H H 826CH 04D8H H D882H D888H D810H 6246H
(2)只能使用目前学过的汇编指令,最多使用四条指令,编程计算2的4次方。 MOV
AX, AX ADD
AX, AX ADD
CPU访问内存单元时要给出内存单元的地址,所有的内存单元构成的存储空间是一个一维的线性空间,我们将这个唯一的地址成为物理地址。 概括的讲,16位的CPU具有以下几个方面特征: 1、运算器一次最多可以处理16位的数据。 2、寄存器的最大宽度为16位。 3、寄存器和运算器之间的通路为16位。 8086有20位的地址总线,可传送20位地址,寻址能力为1M,但是8086内部为16位结构,它只能传送16位的
错误认识:
内存被划分成了一个一个的段,每一个段有一个段地址。 其实:
内存并没有分段,段的划分来自于CPU,由于8086CPU用“ 段地址*16 + 偏移地址 = 物理地址 ”的方式给出内存单元的物理地址,使得我们可以用分段的方式来管理内存。 在编程时可以根据需要,将若干地址连续的内存单元看成一个段,用段地址*16定位段的起始地址(基础地址),用偏移地址定位段中的
& 2012 - 2016 &
&All Rights Reserved. &
/*爱悠闲图+*/
var cpro_id = "u1888441";学习汇编语言,自己的电脑不是8086cpu可以吗_城市论坛
欢迎光临城市论坛!
查看: 284|回复: 9
对CPU没有特别的要求 用三代或者四代酷睿完全没问题 只不过在运行程序的时候会比较快 看不清楚执行过程
看是哪种种类的CPU,学习的ASM汇编可以移植到别的电脑上运行,是因为我们用的这些PC机都是兼容80X86指令系统的,所以可以正常运行 如果兼容的cpu,那就可以移植 但是 c51单片机和80X86系列PC机,它们的汇编程序是不能相通的。 他们的...
汇编语言最没有要求了
8086是基础,学会了之后可以举一反三。就像学编程大多从C语言开始一样,学习不可急功近利,脚踏实地才能走的更远。 ps:不同的CPU有不同的汇编指令。还有,汇编语言属“低级语言”。
兼容,绝对兼容。因为现在的CPU都有多个模式,其中一个就是虚拟8086模式。可以模拟实模式的。再说了,windows据说还有10%的代码是汇编语言写的呢。
不是这么说的,在实模式下,CPU工作情况跟之前的8086是类似的 另外你运行的DEBUG命令程序,其实它是一个模拟器来的,模拟8086下的环境
cs ,ip 还是固定的cs ip 只是寄存器的位数不一样而已.通用寄存器的名字有不一样,你要根据芯片的资料才能看到.如果是是cpu的汇编你就查 指令集
8086是著名的X86系列CPU的早期型号(80年代初期),大约在80年代中期进入我国,当时著名的IBM PC/AT用的就是这个CPU,接下来的芯片型号是8,80486,此时(94年)Intel为了打击对手,不再将新一代芯片型号命名为80586,而启用了奔腾的...
楼主这个问题提得很好。 当初,我就这么认为的。但事实上,不完全是这么回事。的寻址方式的确有一定的限制,但这种限制只是有限的限制。 电脑是美国人发明的,也是美国人首先制造的,它绝对不会让你浪费资源的。 的寻址方式,...
玛咖总经销-丽丽
其实我学的也不怎么样,看样子你已经学到了很高的地步了。你不会在学现在我们用的电脑的指令吧。那应该很多吧,我学过8086CPU的指令那个CPU好像一共就100多条指令。 如果你是想把汇编用在现在电脑的编程中我感觉是不明智的。他会给你带来很大的...最近刚接触汇编,有一堆有关问题,求大神 - 汇编语言当前位置:& &&&最近刚接触汇编,有一堆有关问题,求大神最近刚接触汇编,有一堆有关问题,求大神&&网友分享于:&&浏览:0次最近刚接触汇编,有一堆问题,求大神看的书是王爽的,但介绍的是8086cpu,我不知道自己电脑的内存分配,该如何写程序呢?另外,我们如此随意的分配内存,操作内存,电脑不会出问题吗?------解决思路----------------------给程序分配内存,那是&dos&的事;程序想越规操作自己程序范围外的内存,一个是通过&dos&的内存管理的几个功能调用,或者是要对&dos&的内存分配分布充分的熟悉。所以,建议初涉汇编时,只使用自己程序范围里的空间。------解决思路----------------------上操作系统其中一个很重要的原因就是解决复杂的内存的调用和释放&&&里面给出的内存控制函数使用一般不会产生风险
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 12345678910 Copyright & &&版权所有2387人阅读
通用寄存器:ax、bx、cx、dx。在8086cpu中都是16位的,可拆分成两个8位的来用,如ax可分成al(低8位)、ah(高8位)段寄存器:cs(code segment)、ds(data segment)、ss(stack segment)、es(external segment)可用于内存单元寻址的寄存器:bx、bp、di、si,其中bx、di、si段地址默认在ds中,bp的段地址默认在ss中直接寻址:不使用寄存器。[idata],idata是一个常数,在编写汇编代码时需要添加段前缀,否则编译器会将[idata]解释成一个数据,而不是内存偏移地址。 & & & & & & & & & & & & 如:ds:[idata]表示SA(段地址)=(ds),EA(偏移地址)=idata寄存器间接寻址:使用一个寄存器。只有bx、di、si、bp这四个寄存器能用于内存单元寻址。前三个的段地址默认在ds中,bp的段地址默认在ss中。如:[bx]表示SA=(ds),EA=(bx),[bp]表示SA=(ss),EA=(bp)寄存器相对寻址:使用一个寄存器加一个常数。如[bx+idata]表示SA=(ds),EA=(bx)+idata。实际应用:用于数组idata[bx],把idata想象成数组名,c/c++中数组名存的就是数组的起始地址,把bx想象成数组下标基址变址寻址:使用两个寄存器。如[bx+si]表示SA=(ds),EA=(bx)+(si),bx和si两个都是可变的,可用于二维结构体相对基址变址寻址:使用两个寄存器加一个常数。如[bx+si+idata]表示SA=(ds),EA=(bx)+(si)+idata。实际应用与二维数组:idata[bx][si]。原理同一维数组类似CS:IP:用于定位指令的内存地址。在8086cpu中CS:IP表示SA=(CS),EA=(IP)。每次执行完一条指令,IP会自动增加,增加的值为所执行完指令的长度SS:SP:用于定位栈空间的内存地址。在8086cpu中SS:SP表示SA=(SS),EA=(SP)。在执行push指令时,SP的值会减少,即栈顶指针向低地址方向移动,执行pop指令时则相反标志寄存器flag:用来存储相关指令的某些执行结果;用来为CPU执行某些相关指令提供行为依据;用来控制CPU的相关工作方式。
用来存储相关指令的某些执行结果:在8086CPU的指令集中,有的指令是影响标志寄存器的,如add、sub、mul、div、inc、or、and等运算指令;有的指令的执行对标志寄存器没有影响,如push、pop、mov等传送指令。
ZF标志,零标志位。它记录相关指令执行后,其结果是否为零。如果是,则为1,否则为0PF标志:奇偶标志位。它记录相关指令执行后,其结果的所有位中1的个数是否为偶数。如果是,则为1,否则为0SF标志,符号标志位。它记录相关指令执行后,其结果是否为负。如果是,则为1,否则为0CF标志,进位标志位。一般情况下,在进行无符号数运算的时候,它记录了运算结果的最高有效位向更高位的进位值或借位值OF标志,溢出标志位。一般情况下,在进行有符号数运算的时候,它记录了运算结果是否发生了溢出。如果发生溢出,OF=1,否则OF=0DF标志,方向标志位。在串处理指令中,控制每次操作后si、di的增减:DF=0,每次操作后si、di递增;DF=1,每次操作后si、di递减
用来为CPU执行某些相关指令提供行为依据:
adc指令,带进位加法指令,它利用了CF位上记录的进位值。如adc ax,ax实现的功能是(ax)=(ax)+(ax)+ CFsbb指令,带借位减法指令,它利用了CF位上记录的借位值。如sbb ax,ax实现的功能是(ax)=(ax)-(ax)- CFcmp指令,比较指令,相当于减法指令,不保存运算结果,只改变标志寄存器中相关位的值。cmp指令格式:cmp 操作对象1,操作对象2
对于两个有符号整数a、b,执行cmp a,b指令,通过ZF、SF、OF标志位判断大小:
a&b:ZF=0&&(OF=0&&SF=0 || OF=1&&SF=1)a==b:ZF=1a&b:ZF=0&&(OF=0&&SF=1 || OF=1&&SF=0)
对于两个无符号整数a、b,执行cmp a,b指令,通过ZF、CF标志位判断大小:
a&b:ZF=0&&CF=0a==b:ZF=1a&b:ZF=0&&CF=1
根据无符号数的比较结果进行转移的条件转移指令:
je(jmp equal):等于则转移jne(jmp not equal):不等于则转移jb(jmp below):小于则转移jnb(jmp not below):不小于则转移ja(jmp above):大于则转移jna(jmp not above):不大于则转移
串传送指令:
movsb:将ds:si指向的内存单元中的字节送入es:di中,然后根据DF的值增减si、di的值movsw:将ds:si指向的内存单元中的字送入es:di中,然后根据DF的值增减si、di的值cld:设置DF=0;std:设置DF=1rep movsb:根据cx的值,循环执行movsb。相当于 s:movsb;loop s
mov:进行赋值操作。注意:段寄存器必须要通过其它寄存器来赋值,不能直接赋值;在赋值时需指定数据大小,用 byte ptr 或word ptr,如 mov byte ptr, [bx]add:加sub:减div:除。用ax和dx两个寄存器来存被除数。在8086cpu中被除数有16位和32位两种情况,如果是16位,直接用ax来存,如果是32位,用ax存低16位,dx存高16位;除数有8位和16位两种情况,如果除数为8位,则al存除法操作的商,ah存余数;如果除数为16位,则ax存除法操作的商,dx存余数mul:乘。两个相乘的数,要么都是8位,要么都是16位。如果都是8位,一个默认放在AL中,结果默认放在AX中;如果都是16位,一个默认放在AX中。结果高位放在DX中,低位放在AX中数据指定:dd(data double word)、dw(data word)、db(data byte),可用dub重复数据,格式:dd/dw/db 重复的次数 dup(重复的数据内容)位操作:and,orloop:循环指令。通过命名标识来实现,可以嵌套循环,循环次数存储在cx中操作符offset,放在标识名的前面,用来获取标识名的段内偏移地址jmp指令是根据位移来进行转移的。cpu在执行jmp指令时,用jmp标号的地址减去jmp指令下一条指令地址,从而得到位移,这样提高灵活性转移地址在指令中的jmp指令:段内转移:jmp short 标号(8位位移);jmp near ptr标号( 16位位移);段间转移:jmp far ptr 标号,会同时修改CS和IP的值转移地址在寄存器中的jmp指令:jmp 寄存器表示为IP=(寄存器)转移地址在内存中的jmp指令:jmp word ptr 内存单元地址(段内转移);jmp dword ptr内存单元地址(段间转移),IP=(内存单元地址),CS=(内存单元地址+2)jcxz指令:条件指令,判断cx是否等于0,如果c等于0,则跳转到标号位置,否则没有任何作用。jcxz标号 相当于 if(cx==0) jmp short 标号ret指令:用栈中的数据修改IP的值,实现段内近转移。相当于pop IPretf指令:用栈中的数据修改IP、CS的值,实现段间转移。相当于pop IP、pop CScall指令:将当前的IP或CS值入栈,然后转移call 标号 相当于 push IP;jmp near ptr 标号call far ptr 标号 相当于 push CS; push IP;jmp far ptr 标号call 16位reg &相当于 push IP; jmp 16位regcall word ptr 内存单元地址 相当于 push IP,jmp word ptr 内存单元地址call dword ptr 内存单元地址 相当于 push CS,push IP,jmp dword ptr 内存单元地址call 和ret指令搭配使用可实现子程序的调用lea指令:把数据的内存地址载入到寄存器中。形如lea &reg,[data]&
中断信息:
除法错误:0单步执行:1。TF=1执行into指令:4执行int指令:int n,n即为中断类型码。
中断过程,由硬件自动完成:
从中断信息中取得中断类型码:N;将标志寄存器的值入栈:pushf;设置标志寄存器的第8位TF和第9位IF的值为0:TF=0,IF=0;CS的内容入栈:push CS;IP的内容入栈:push IP;根据中断类型码,从中断向量表中读取中断处理程序的入口地址,设置CS和IP的值:(IP) = (N*4),(CS) = (N*4+2)。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:86054次
积分:1334
积分:1334
排名:千里之外
原创:43篇
转载:12篇
评论:42条
(2)(1)(1)(2)(4)(2)(2)(13)(12)(10)(6)

我要回帖

更多关于 8086新视觉影院 的文章

 

随机推荐