第一个汇编程序

时间:2022-11-20 01:08:43

1、几个指令

  (1)、汇编指令:有对应的机器码的指令,可以被编译为机器指令,最终为CPU所执行;

  (2)、伪指令:没有对应的机器码的指令,最终不被CPU所执行;

  伪指令是由编译器来执行的指令,编译器根据伪指令来进行相关的编译工作;

  (3)、segment和ends是一对成对使用的伪指令,这是在写被编译器编译的汇编程序时,必须要用到的一对伪指令;

  (4)、segment和ends的功能是定义一个段,segment说明一个段的开始,ends说明一个段的结束。

  (5)、一个段必须有一个名称来标识,使用格式:段名 segment .....段名ends;

  (6)、一个有意义的汇编程序至少要有一个段,这个段用来存放代码;

  (7)、end(伪指令)是汇编程序结束的标记;程序结束时必须加上end,否则,编译器在编译程序时,无法知道程序在何处结束;

  (8)、assume:含义"假设",定义段寄存器和程序中的段相关联的,编译程序时段寄存器可以和某一个具体的段相联系;


2、汇编源程序

  程序:源程序中最终由计算机执行、处理的指令或数据;

  (1)、伪指令:编译器处理;

  (2)、汇编指令:编译为机器码;

  (3)、标号:一个标号指代了一个地址,codesg:放在segment前面,作为一个段的名称,这个段的名称最终被编译、连接程序处理为一个段的段地址;

  (4)、程序的返回:一个程序结束后,将CPU的控制权交还给使它得以运行的程序,这个过程就是"程序返回";返回的程序段:mov ax,4c00H int 21H


3、结束

  (1)、段结束:ends   编译器执行 

  (2)、程序结束:end   编译器执行

  (3)、程序返回:mov ax,4c00H int 21H   由CPU执行


4、汇编程序

  汇编程序的扩展名:.asm

  汇编程序的注释:;

  源代码(没有汇编代码格式,只能用C语言的格式上传代码了):

下面的这个程序是没有入口的:

assume cs:abc
abc segment   ;定义一个abc段
  mov ax, 2
  add ax, ax
  add ax, ax
    
  mov ax, 4c00H
  int 21H
abc ends

end

  进行编译--->链接---->执行;

  此时我们必须的下载汇编的编译工具:MASM6.15;

第一个汇编程序

第一个汇编程序

  下面的执行都是在DOS下面进行的,先到我们要执行的目录中去。

  (1)、第一种执行方案:

    编译:masm 1.asm;

    链接:link 1.obj;

    执行:1.exe

  (2)、第二种执行方案:

    编译和链接:ml 1.asm

    执行:1.exe

结果图:

第一个汇编程序


5、准备工具

  编写汇编需要准备的工具:编辑器(Notepad++/UE)、编译器(masm)、连接器(link)、调试工具(debug)winxp是自带的...

  Debug可以将程序加载入内存,设置CS:IP指向程序的入口,但Debug并不放弃对CPU的控制,这样,我们就可以使用Debug的相关命令来进行单步执行程序,查看每条指令的执行结果。


6、有入口的汇编程序

代码如下(没有汇编代码格式,只能用C语言的格式上传代码了):

assume cs:codesgcodesg segmentstart: mov ax, 0123H    mov bx, 0456H    add ax, bx    add ax, ax        mov ax, 4C00H    int 21Hcodesg endsend start

执行debug 1.exe(对这个汇编程序进行加载)就可以进行Debug的单步调试了;

第一个汇编程序

第一个汇编程序

总结:

  (1)、程序加载后,ds中存放着程序所在内存区的段地址,这个内存区的偏移地址为0,则程序所在的内存区的地址为:ds:0;

  (2)、这个内存区的前256个字节中存放的是PSP,dos用来和程序进行通信;

  (3)、从256字节处向后的空间存放的是程序;


7、程序执行过程的跟踪

  (1)、U命令查看本汇编程序其他指令,R可以查看当前寄存器的值并可以修改CS:IP的值;

  (2)、T命令单步跟踪;

  (3)、执行到INT 21,用P命令正常结束;

第一个汇编程序


8、加载原理

  (1)、DOS中用“debug 1.exe”运行debug对1.exe进行跟踪,程序加载顺序:command加载debug,debug加载1.exe;

  (2)、按q命令退出debug模式;

  返回的顺序:从1.exe程序返回到debug,从debug返回到command。




本文出自 “wait0804” 博客,请务必保留此出处http://wait0804.blog.51cto.com/11586096/1867385