汇编语言第4~6章要点

1.与结束相关的概念
通知编译器一个段结束 段名 ends 伪指令 编译时,由编译器执行
通知编译器程序结束 end 伪指令 编译时,由编译器执行
程序返回 mov ax,4c00h int 21h 汇编指令 执行时,由cpu执行
2.程序在编译时被发现的是语法错误,在运行时被发现的是逻辑错误,语法错误容易发现,而逻辑错误不容易被发现
3.在DOS中,可执行文件中的程序p1若要运行,必须有一个正在运行的可执行程序p2,将p1从可执行文件中加载入内存,将cpu控制权交给它,p1才能得以运行,当p1运行完毕后,应该将cpu的控制权交还给使它得以运行的程序p2。
4.编程(Edit)->1.asm->编译(masm)->1.obj->连接(link)->1.exe->加载(command)->内存中的程序->运行(cpu)->返回(command)
5.((ds)*16+bx)是正确的写法,((ds):1000h)不是正确的写法
6.在汇编程序中,数据不能以字母开头,所以要在前面加0
7.g 0012将使Debug从当前的CS:IP指向的命令执行,一直到(IP)=0012h为止
8.mov al,ds:[0]
mov al,[0] = mov al,0
[0]的前面必须要加上段地址寄存器
9.如果我们需要向内存空间写入数据的话,要使用操作系统分配给我们的空间,而不应该直接用地址任意指定内存空间向里面写入,
因为运行在cpu实模式下的dos,没有能力对硬件系统进行全面、严格地管理,但在Windows2000这些运行于cpu保护模式下的操作系统中,不理会操作系统,用汇编语言去操作真实的硬件,是根本不可能的。一般的dos方式下和其他合法的程序都不会使用0:200~0:2ff的256个字节的空间
10.怎样将ffff:0~ffff:b中的8位数据,累加到16位寄存器dx中?
目前的方法就是用一个16位寄存器来做中介,将内存单元中的8位数据赋值到一个16位寄存器ax中,再将ax中的数据加到dx上,从而使两个运算对象的类型匹配并且结果不会超界。
检测点6.1
下面程序实现依次用内存0:0~0:15单元中的内容改写程序中的数据,完成程序

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

   start: mov ax,cs
          mov ss,ax;将cs中的内容调入ss寄存器中,
          mov sp,26;指令总长度为26B,要求对于一般指令的长度较为了解
          mov ax,0
          mov ds,ax
          mov bx,0
          mov cx,8
        s:push [bx];将ds:[bx]中的内容压入栈空间(dw 0,0,0)的位置
          pop cs:[bx];弹栈重新放入程序的相应位置
          ;ds:0000~ds:000f中原先存储的为0123h,0456h到0987h
          ;现在要用内存0:0~0:15中的其他值改写0123h,0456h到0987h这一段的数据
          add bx,2
          loop s

          mov ax,4c00h
          int 21h

codesg  ends

end start
发布了17 篇原创文章 · 获赞 7 · 访问量 2990

猜你喜欢

转载自blog.csdn.net/znevegiveup1/article/details/103780809