汇编语言学习笔记(二)-----程序

一、源程序

栗子:

assume cs:codesg

condesg segment

start:    mov ax,0123H

            mov bx,D456H

            add ax,bx

            add ax,ax

            mov ax,4c00H

            int 21H

codesg ends

end

    1.伪指令:由编译器执行;xx  segment 和xx  ends是一对成对使用的伪指令,功能是定义一个短。assume假设伪指令,assume cs:codesg 将用作代码段的段codesg和CPU中的段寄存器cs关联起来

    2.标号:codesg 作为一个段的名称,指代一个地址。

    3.程序返回: 一个程序结束后,将CPU的控制权交给使他得以运行的程序,我们称这个过程为程序返回。程序末尾添加 mov  ax,4c00h   int 21H .这两条指令就可以实现程序的返回。

       4.masm.exe(编译器)编译过程中,输入一个源程序文件,最多得到3个输出:目标文件(.obj)、列表文件(.lst)、交叉引用文件(.crf)。

        5.链接。link.exe(连接器),把.obj文件链接为.exe文件。

      6.编程(edit)-->1.asm--->编译(masm)--->1.obj--->链接(link)--->1.exe-->加载(command)-->运行(CPU)

        7.程序装载内存过程(举例)


       

程序加载后,ds中存放着程序所在内存区的段地址,这个内存区的偏移地址为0,即程序所在内存区的地址为ds:0

这个内存区的前256个字节中存放的是PSP,dos用来和程序进行通信,从256个字节后的空间存放的是程序,程序的物理地址为:

SA*16+0+256=(SA+16)*16+0    这个是10进制的

所以物理地址为SA+10:0                 这才是标准的16进制表示

(转载部分:https://blog.csdn.net/hanyuwei0/article/details/5200910)

二、[bx]和loop指令

    1.[bx]和内存单元的描述

    [bx]和[0]有些类似,[0]表示内存单元,他的偏移地址是0,。栗子:mov ax,[0],将一个内存单元的内存送入ax,这个内存单元的长度是2字节,存放一个字,偏移地址为0,段地址载ds中;mov al,[0]  将一个内存单元的内容送入al,内存单元的长度为1字节。偏移地址0,段地址载ds中。

    由此可见,描述一个内存单元需要两种信息:1)内存单元的地址;2)内存单元的长度(类型)

    我们用[0]表示一个内存单元时,0表示单元的偏移地址,段地址默认在ds中,单元长度由具体指令中的其他操作对象(比如寄存器)指出。

    [bx]同样也表示一个内存单元,他的偏移地址在在bx中,段地址在ds中

    栗子:mov ax,[bx] 将一个内存单元的额内容送入ax,这个内存单元的长度为2字节,偏移地址在bx中,段地址在ds中。

    2.定义描述性符号“()”

    ()表示寄存器或一个内存单元中的内容

    ()中的元素可用三种类型:1)寄存器名;2)段寄存器名;3)内存单元的物理地址(一个20位数据)

        栗子:2000:1000处的内容为0010H,可描述为:(21000H)=0010H

        mov ax,[2]的功能  描述为:(ax)=((ds)*16+2);

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

        add ax,2                               (ax)=(ax)+2;

        push ax                                  (sp)=(sp)-2      ((ss)*16+(sp))=(ax)

        pop ax                                  (ax)=((ss)*16+(sp))            (sp)=(sp)+2;

        (X)所掉膘的数据类型:1)字节,2)字;是那种类型有寄存器名或具体运算决定

        (al)、(bl)、(cl)等得到的数据为字节型;(ds)、(ax)、(bx)得到的数据类型为字型

        idata表示常量

        3.[bx]

        栗子:mov ax,[bx]   ::::bx中存放的数据作为一个偏移地址EA,段地址SA默认在ds中,将SA:EA处的数据送入ax中,即:(ax)=((ds)*16+(bx));

        4.loop指令

        loop标号,CPU执行loop指令的时候,进行两步操作:1)(cx)=(cx)+1;2)判断cx中的值,不为零则专职标号处执行程序,如果为零则乡下执行。cx中存放循环次数:栗子

        assume cs:code

        code segment

                    mov ax,2

                    mov cx,11

        s: add ax,ax

            loop s

            mov ax,4c00h

            int 21h

        code ends

        end

        5.段前缀

        栗子:mov ax,cs:[bx]     将一个内存单元的内容送入ax,这个内存单元的长度2字节(字单元),存放一个字,偏移地址在bx中,段地址载ds中。

        一般在PC机中,DOS方式下,DOS和其他合法的程序一般都不会使用0:200---0:300(00200h--00300h)的256个字节空间。所以这段空间是安全的。













































































  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值