首页 > 其他 > 详细

第四到八章 章节性总结

时间:2018-12-17 22:55:13      阅读:160      评论:0      收藏:0      [点我收藏+]

第四章:汇编源程序

技术分享图片

技术分享图片

要完成一个程序必须要先编写汇编源文件,然后进行汇编,链接,执行。使用debug调试时,调试的必须是连接后得到的可执行文件,并且要带扩展名。即: debug ××.exe。

 第五章

  用[0]表示一个内存单元时,0表示单元的偏移地址,段地址默认在ds中,单元的长度(类型)可以由具体指令中的其他操作对象(比如说寄存器)指出。[bx]同样也表示一个内存单元,它的偏移地址在bx中。

[BX]

mov ax,[bx]  即(ax)=((ds)*16+(bx))             mov [bx],ax 即((ds)*16+(bx))=(ax)

 inc bx     在bx中的内容加1

loop 指令

  loop指令的格式是:loop 标号,CPU执行loop指令的时候,要进行两步操作,先(cx)=(cx)-1,然后判断cx中的值,不为0则转至标号处执行程序,如果为0则向下执行。在汇编语言中,标号代表一个地址。cx中的值影响着loop指令的执行结果。通常我们用loop指令来实现循环功能,cx中存放循环次数。

  使用cx和loop指令的要点:在cx中存放循环次数 ,loop指令中的标号所标识地址要放在前面,要循环执行的程序段,要写在标号和loop指令的中间。

第六章

转:(一)代码段和数据段同时存在

assume cs:code

code segment

     dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h

     start: mov bx,0

              mov ax,0

              mov cx,8

       s:     add ax,cs:[bx]

              add bx,2

              loop s

              mov ax,4c00h

              int 21h

code ends

end start

(二)在代码段中使用栈

assume cs:codesg

codesg segment

    dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h

    dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //定义16个字形数据,将这段空间当做栈

    start: mov ax,cs

             mov ss,ax

             mov sp,30h

             mov bx,0

             mov cx,8

        s:   push cs:[bx]

             add bx,2

             loop s

             mov bx,0

             mov cx,8

      s0:   pop cs:[bx]

             add bx,2

             loop s0

             mov ax,4c00h

             int 21h

codesg ends

end start

(三)将数据,代码,栈放入不同的段

assume cs:code,ds:data,ss:stack

data segment

    dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h

data ends

stack segment

     dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

stack ends

code segment

start:   mov ax,stack

           mov ss,ax

           mov sp,20h

           mov ax,data

           mov ds,ax

           mov bx,0

           mov cx,8

       s:  push [bx]

           add bx,2

           loop s

      s0: pop [bx]

            add bx,2

            loop s0

            mov ax,4c00h

            int 21h

code ends

end start

dw伪指令:即“define word”,告诉编译器接下来定义字型数据 

第七章 
and 指令:按位逻辑与: al ← (al) ^ 001110100 B

or指令:按位逻辑或: al ← (al) ∨ 001110100B

[bx]代表一个内存地址的偏移量。假设其段地址在ds中。那么[bx]可以表示值为((ds)*16+(bx))

[bx+idata]其中idata代表常量,同样表示一个地址:((ds)*16+(bx)+200)

SI和DI与普通寄存器一样,但是SI和DI不能像AX一样分成AL和AH两个寄存器。

假设段地址为ds,[bx+si]解释为((ds)*16+(bx)+(si))

假设段地址为ds,[bx+si]解释为((ds)*16+(bx)+(di))

假设段地址为ds,[bx+si+idata]解释为((ds)*16+(bx)+(si)+idata)

假设段地址为ds,[bx+di+idata]解释为((ds)*16+(bx)+(di)+idata)

第八章

eg的集合包括:ax、bx、cx、dx、ah、al、bh、bl、ch、cl、dh、dl、sp、bp、si、di。

sreg的集合包括:ds、ss、cs、es。

对于机器指令这一层来说,并不关心数据的值是多少,而关心指令执行前一刻,它将要处理的数据所在的位置,所要处理的数据可以在3个地方:CPU内部、内存、端口。

数据位置的表达:

(1)立即数(idata)
对于直接包含在机器指令中的数据(执行前在CPU的指令缓冲器中),在汇编语言中称为:立即数(idata),在汇编指令中直接给出。例如:mov ax,1 | add bx,2000h | or bx,00010000b | mov al,‘a‘。
(2)寄存器
指令要处理的数据在寄存器中,在汇编指令中给出相应的寄存器名。例如:mov ax,bx | mov ds,ax | push bx | mov ds:[0],bx | push ds | mov ss,ax | mov sp,ax。
(3)段地址(SA)和偏移地址(EA)
指令要处理的数据在内存中,在汇编指令中可用[X]格式给出EA,SA在某个段寄存器中。

8086CPU的指令,可以处理两种尺寸的数据,byte和word。所以在机器指令中药指明,指令进行的是字操作还是字节操作。

div是除法指令,使用div做除法的时候应该注意以下问题:除数:有8位和16位两种,在一个reg或内存单元中。被除数:默认放在AX或DX和AX中,如果除数为8位,被除数则为16位,默认在AX中存放;如果除数为16位,被除数则为32位,在DX和AX中存放,DX存放高16位,AX存放低16位。结果:如果除数为8位,则AL存储除法操作的商,AH存储除法操作的余数;如果除数为16位,则AX存储除法操作的商,DX存储除法操作的余数。

dup是一个操作符,在汇编语言中同db、dw、dd等一样,也是由编译器识别处理的符号。它是和db、dw、dd等数据定义伪指令配合使用的,用来进行数据的重复。

第四到八章 章节性总结

原文:https://www.cnblogs.com/lostway/p/10134425.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!