两个问题: 8位寄存器与16位不能直接相加仅使用16位中的8位数据容量不足以一个16位寄存器为中介,8位数据存入低8位,高八位为0段前缀:显式指明段地址ds:xx
bx 8位,存放偏移地址offffh:汇编中,数据不能以字母开头,因而要多加一个0
loop 循环cx 存储循环次数循环方式:标号:代码段loop 标号
mov ax,[0]形式不可直接使用需将0存入bx中,使用mov ax,[bx]形式描述性符号:(),直接代表寄存器中存储的内容idata 常量标识符inc 自加
标号start:程序入口SA:内存中程序起始地址PSP:前缀,用于通信 256字节
标号:唯一的一个物理地址程序返回:一个程序结束后将控制权交还给使得它运行的程序int:汇编中的中断Masm Assemblymasm filename链接器:链接库与程序,形成可执行文件
段名segment段名 ends 定义一个段end 程序的结束Assume 指出段寄存器与段之间的联系
段的综述栈段,用作栈的段
Push Pop指令详解
CMD Debug指令
8086cpu不支持将数据直接送入段寄存器的操作,所以不可以使用 mov ds,1000这种形式给ds段寄存器赋值。只好用一个寄存器进行中转:mov ax,1000 mov ds,ax[...]表示一个内存单元,[0]表示内存单元的偏移地址,段地址默认在ds中。 小甲鱼:段寄存器是一个害羞的姑娘,你不能直接向她表白~~~~得用媒人。
修改CS、IP的值,不能像修改AX一样用mov来修改了。那怎么修改?用转移指令:同时修改cs、ip ,用jmp 0800:3 。相当于 " jmp 段地址:偏移地址"只修改ip ,用 "jmp 寄存器",mov ax,1000 jmp ax 就修改了ip值为1000
1个内存单元 1B=8Bit
汇编语言的组成:1 汇编指令(机器码的助记符)2 伪指令(由编译器组成)3 其他符号(由编译器识别)汇编语言的核心是汇编指令,决定了汇编语言的特性cpu是计算机的核心部件,控件整个计算机运作并运算,CPU工作时需要提供指令和数据内存是一个主要的存储器磁盘不同于内存,磁盘的数据或程序如果不读到内存,cpu无法使用4 存储单元存储器被分为若干个存储单元,每个存储单元从0开始顺序编号,存储器不等于内存1KB=1024B,1MB=1024KB,1GB=1024MB,1TB=1024GB5 cpu对存储器的读写存储单元的地址(地址信息)读写的命令(控制信息)读写的数据(数据信息)在计算机中有专门连接cpu和其他芯片的导线,通常称为总线地址总线,数据总线控制总线cpu——地址总线—— 内存
汇编语言是直接在硬件上互作的语言机器指令展开来讲就是一台机器可以正确执行指令汇编语言的主体是汇编指令汇编指令是机器指令的助记符寄存器:cpu里面的存储器有14个
1字节==8位1Byte==8bit数据总线---宽度决定CPU与外界的数据传输速度控制总线---宽度决定对外部器件的控制能力
组成:汇编指令伪指令其他符号内存----指令和数据指令和数据--都是二进制信息(在内存或磁盘上)CPU进行数据的读写:存储单元地址(地址信息)器件的选择,读写命令(控制信息)读写的数据(数据信息)总线:连接CPU和其他芯片的导线地址总线数据总线控制总线
8086CPU有14个寄存器,AX,BX,CX,DX,SI,DI,SP,BP,IP,CS,SS,DS,ES,PSW8086CPU都是16位,AX,BX,CX,DX是通用寄存器AX,BX,CX和DX和可以分为XH和XL表示高位和低位
我们可以将长度为N(N《=64KB)的一组地址连续,起始地址为16的倍数的内存单元,当作栈来使用,从而定义了一个栈段。将一段内存当作栈段,仅仅是我们在编程时的一种安排,CPU并不会由于这种安排,就在执行PUSH,POP等栈操作指令时就自动地将我们定义的栈段当作栈空间来访问。将SS:SP指向我们定义的栈段。在之前有一道例子:在1000H--1000FH这段空间当作栈段,初始状态是空的,此时,SS=1000H,SP=0010.现在,如果我们将10000H-1FFFFH这段空间当作栈段,初始状态是空的,SS=1000H,则SP=?分析:我们将10000H-1FFFFH这段空间当作栈段,SS=1000H,栈空间大小为64KB,栈最底部的字单元地址为1000:FFFE。任意时刻,SS:SP指向栈顶,当栈中只有一个元素的时候,SS=1000H,SP=FFFE。栈为空,就相当于栈中唯一的元素出栈,出栈后,SP=SP+2。SP原来为FFFE,加2后SP=0,所以,当栈为空的时候,SS=1000H,SP=0. 一个栈段最大可以设为多少?2的16次方=64KB利用PUSH和POP都是利用SP操作的,SS是不变的,所以栈顶的变化范围是0-FFFFH,从栈空时候的SP=0,一直压栈,直到栈满时SP=0,如果再次压栈,栈顶将环绕,覆盖了原来栈中的内容。 一段内存,可以既是代码的存储空间,又是数据的存数空间,还可以是栈的空间,也可以什么都不是关键在于CPU中寄存器的设置,即CS.IP.SS.SP.DS的指向
数据不能直接跟段寄存器进行交互的,要经过通用寄存器。题目:将10000H-1000FH这段空间当做栈,初始状态是空的,将AX。BX.DS中的数据入栈。解答:MOV AX,1000HMOV SS,AXMOV SP,0010H:因为栈不空,所以SP=0010H。指针指向栈顶加1PUSH AXPUSH BXPUSH DS 我们要十分清楚的是:PUSH和POP指令同MOV指令不同,CPU执行MOV指令只需要一步操作,就是传送,而执行PUSH和POP指令却需要两步操作。执行PUSH时:先改变SP,后向SS:SP处传送。执行POP时:先读取SS:SP处的数据,后改变SP PUSH。POP等栈操作指令,修改的只是SP,也就是说,栈顶的变化范围最大为:0-FFFFH,也就是64KB的范围。(偏移地址16位的CPU) 8086CPU只记录栈顶,栈空间的大小我们要自己管理。 用栈来暂存以后要恢复的寄存器的内容时,寄存器出栈的顺序要和入栈的顺序相反。 PUSH和POP实质上时一种内存传送指令;