摘要:
1、8086CPU的标志寄存器(flag)有16位,其中存储的信息通常被称为程序状态字(PSW,program state word)。标志寄存器是按位起作用的,也就是说,它的每一位都有专门的含义,记录特定的信息(用0或者1表示有还是没有)2、flag中的1、3、5、12、13、14、15在8086中没有使用,不具有任何意义。第六位是ZF,零标志位,它记录相关指令执行后,结果为0,ZF=1,结果不为0,ZF=0。第二位PF,奇偶标志位,记录结果的所有二进制位中1的个数,偶数,PF=1。第七位SF,符号标志位,结果为负,SF=1。第零位CF,进位标志位,一般来说,在进行无符号数运算的时候,它记录 阅读全文
摘要:
1、call和ret指令都是转移指令,他们都修改ip或同时修改cs和ip。2、ret指令用栈中的数据,修改ip的内容,从而实现近转移。操作:1.(ip)=((ss*16)+(sp));2.(sp)=(sp)+2。retf指令用栈中的内容同时修改cs和ip3、call指令经常跟ret指令配合使用,因此CPU执行call指令,进行两步操作:1.将当前的ip或cs和ip压入栈中;2.转移(jmp)。Call指令不能实现短转移,跟jmp操作相似。操作:1.push IP;2.jum near ptr 标号。范围-32768~32767,补码表示。(转移位移)4、转移的目的地址在指令中的call指令:段 阅读全文
摘要:
1、8086CPU转移指令分类:1.无条件转移指令(如jmp);2.条件转移指令;3.循环指令(如:loop);4.过程;5.中断。2、offse,伪指令,功能是取得标号的偏移地址。3、nop的机器码占一个字节,不产生任何结构,仅消耗几个时钟周期,接着执行后续指令,常用于程序的延时等。4、jmp指令要给出两种信息:1.转移的目的地址;2.转移的距离(段间转移、段内短转移、段内近转移)。5、依据位移进行的jmp指令:①jmp short 标号(转到标号处执行指令),这种格式的jmp指令实现的是段内短转移,它对ip的修改范围为-128~127;②jup near ptr 标号,near ptr指明 阅读全文
摘要:
实验九头疼了一天,终于搞定了,其实也不是算法问题,算法倒是挺简单的,主要是显示问题,好纠结。。。。View Code 1 ;测试:向内存从b810:0000开始的单元写入数据如:-e B810:0000 01 01 02 02 03 03 04 04 2 assume cs:code,ds:data,ss:stack 3 4 data segment 5 db 'welcome to masm!' 6 data ends 7 8 stack segment 9 dw 0,0,010 stack ends11 code segment12 13 start: mov... 阅读全文
摘要:
1、计算机是进行数据处理、运算的机器,那么有两个最基本的问题:1.处理的数据在什么地方?2.要处理的数据有多长?2、定义描述性符号:reg(register 寄存器)和sreg(segment register 段寄存器)。Reg的集合包括:ax、bx、cx、dx、ah、al、bh、bl、ch、cl、dh、dl、sp、bp、si、di。sreg集合包括:ds、ss、cs、es(扩展段)。3、1.在8086CPU只有这4个寄存器(bx、bp、si、di)可以用[ ]来进行内存单元寻址;2.在[ ]中,这四个寄存器(bx、bp、si、di)可以单个出现,或只能以四种组合出现:bx和si、bx和di 阅读全文
摘要:
1、and指令:逻辑与指令,按位进行运算,通过and指令可将操作对象的相应位设为0,其他位不变,例:and al 10111111B。or指令:逻辑或指令,按位进行运算,通过or指令可将操作对象的相应位设为1,其他位不变,例:or al 01000000B。2、用字母表示数据,例:‘a’。3、小写转大写and al 11011111b。大写转小写or al 00100000b。4、[bx+idata]形式实现数组:idata[bx]。5、SI和DI寄存器:16位寄存器,但是不能够分为两个8位寄存器来使用。6、16位寄存器进行内存单元之间的数据传送,一次复制两个字节。[bx][si]。7、[bx 阅读全文
摘要:
1、在代码段中使用数据:“dw”定义字型数据,即define word。定义字节型数据db,define byte。dw定义数据处于代码段的最开始,所以偏移地址为0。2、CPU根据机器指令的不同组合会构成不同的代码。3、在代码段中使用栈:定义8个字型数据也可以说开辟了8个字型空间。4、将数据、代码、栈放入不同的段:实验五:5、mov ax,aMov cs,axMov ax,bMov ds axMov ax,cMov ss,axMov bx,0Mov cx,8S:add ss:[bx],ds[bx]Add ss:[bx],cs[bx]Add bx,2Loop s6、mov ax,aMov ds, 阅读全文
摘要:
1、用debug写命令和编译器写命令是不一样的。2、完整的描述一个内存单元需要两种信息:1.内存单元的地址;2.内存单元的长度(类型)。我们用[0]表示一个内存单元时,0表示单元的偏移地址,段地址默认在ds中,单元的长度(类型)可以由具体指令中的其他操作对象(比如说寄存器)指出,如前边的AX,AL。3、[bx]同样也表示一个内存单元,它的偏移地址在bx。4、描述性符号“()”表示取内容。约定符号idata表示常量。5、loop指令使用:1.在cx中存放循环次数;2.loop指令中的标号所标识地址要在签名;3.要执行的程序段要写在标号和loop指令中间。6、考虑计算会不会溢出。7、把内存单元xx 阅读全文
摘要:
1、一个程序从写出到执行的过程:编写(使用文本编辑器)、编译链接(使用汇编语言编译程序(MASM.EXE)对源程序编译,产生目标文件,在用链接程序(link.exe)对目标文件进行链接,生产可执行文件)、执行(操作系统依照可执行文件中的描述信息,将可执行文件中的机器码和数据加载入内存,并进行相关的初始化(比如:设置CS:IP指向第一条要执行的指令),然后由CPU执行程序。2、可执行文件:1.程序(从源程序中的汇编指令翻译过来的机器码)和数据(源程序中定义的数据)2.相关的描述信息(比如:程序有多大、要占多少内存空间等)。PE(黑客)3、源程序:汇编指令(有对应的机器码,最终被CPU执行)、伪指 阅读全文
摘要:
1、字型数据考虑两个字节,本高字单元+本字单元2、DS和[address]:DS存放要访问数据的段地址。3、mov指令可以完成两种传送功能:1.将数据直接送入寄存器;2.讲一个寄存器中的内容送入到另一个寄存器。除此之外,mov指令还可以将一个内存单元中的内容送入到一个寄存器。例mov al,[0]。执行指令时,8086CPU会自动取DS中的数据为内存单元的段地址。4、如何把1000H送入DS?8086CPU不支持将数据直接送入段寄存器的操作,DS是一个段寄存器(硬件设计问题)。数据——通用寄存器——段寄存器。5、如何将al中的数据送入内存单元10000H?6、[0]何时是一个字,何时是一个字节 阅读全文