body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gray; border-width: 2px 0 2px 0;} th{border: 1px solid gray; padding: 4px; background-color: #DDD;} td{border: 1px solid gray; padding: 4px;} tr:nth-child(2n){background-color: #f8f8f8;}

assume cs:codesg
codesg segment                  ; codesg 段开始
start:   mov ax , 0123
           mov bx , 0456
           add ax , bx
           add ax , ax
 
           mov ax , 4c00
           int 21h                       ;后面两条指令实现程序返回,交还控制权
codesg ends                      ;codesg 段结束
end
定义了一个 codesg 的段,这个段中存放我们的代码,开头伪指令用 assume 将用做代码段的段 codesg 和 CPU 中的段寄存器 cs 联系起来。

1、伪指令:汇编语言中包含两种指令,汇编指令和伪指令;汇编指令是有对应机器码的指令,可以被编译为机器指令,最终为 CPU 所执行。而伪指令没有对应的机器指令,最终不被 CPU 所执行。伪指令是由编译器来执行的指令,编译器根据伪指令来进行相关的编译工作。
XXX segment   ;XXX 段开始
    :
    :
    : 
XXX ends          ;XXX 段结束
segment 和 ends 是一对成对使用的伪指令 ,这是写可被编译器编译的汇编文件时,必须要用到的一对伪指令。segment 和 ends 的功能是定义一个段,segment说明一个段的开始,ends说明一个段的结束。


一个汇编程序由多个段组成,这些段被用来存放代码、数据、或当作栈空间来使用。一个源程序中所有将被计算机所处理的信息:指令,数据,栈,被划分到了不同的段中。
end 一个汇编程序的结束标记,编译器在编译汇编程序的过程中,如果碰到伪指令 end ,就结束对源程序的编译。
assume “假设”,它假设某一段寄存器和程序中的某一个用 segment ... ends 定义的段相关联。通过这种关联,需要的情况下编译程序可以将段寄存器和某一个具体的段相联系关联起来。

2、源程序中的“程序”
  这里的程序只源程序中最终由计算机执行、处理的指令或数据;伪指令由编译器来处理,不算这里的“程序”;
3、标号
  eg: “codesg” ;一个标号指代了一个地址。“codesg”做为一个段的名称,这个段的名称最终将被编译、连接程序处理为一个段的段地址。
4、程序的结构
  源程序由一些段构成,这些段中存放着代码、数据或将某个段当做栈空空间。
eg: 编程运算 2^3
①定义一个段叫做“abc”;
②段中写入汇编指令;
③指出程序在哪里结束;
④adc 当作代码段来用;(对于这个例子非必须)
为了程序运行结束能交出cpu控制权,应该在最后加上中断  返回;在同edit编辑代码的时候可以在数后面加上h,不加会出错
assume cs:abc
abc segment
       mov ax , 2
       mov ax , ax
       mov ax , ax
       mov ax , 4c00h
       int 21
abc ends
end
5、语法错误和逻辑错误
  语法错误编译器可以发现,逻辑错误编译器发现不了,等到运行时出bug;




编辑源程序
(需要下载一个edit.com文件,类似debug.exe)
文件写完后可以 File-》Save as 保存到刚才 mount 的文件夹
编译
(需要下载一个 masm 5.0 汇编编译器,文件名为 masm.exe)
连接
(需要下载一个LINK.exe文件)
**操作系统外壳(shell):任何通用的操作系统,都要提供一个称为shell的程序,用户(操作人员)使用这个程序来操作计算机系统进行工作。

调试跟踪汇编程序
ds 存放 PSP 的段地址,偏移为 0,所以程序的物理地址就是 SA*16+0+256=SA*16+16*16+0=(SA+16)*16+0;
最终就是:SA+10:0  
DS=075A , PSP 的地址就为 075A:0 ; 程序的地址就为 CS:IP = 076A:0
q 命令退出debug

programing的更多相关文章

  1. Android Programing 学习笔记(一)

    最近学习android 开发,拜读android programing,一步一步学习.囫囵吞枣,现已看到第十八章.今天把最近的学习过程中学到的一些内容进行一下总结. 一:Fragment 和 Acti ...

  2. lua 初接触 --- The first time use Lua for programing

    The first time use Lua for programing Wang Xiao 1. 关于 lua 的变量类型:  lua 变量的定义与matlab有点不同: local d , f ...

  3. AOP 面向方面的编程 Aspect Oriented Programing --第一次听说呢,汗!

    http://wayfarer.cnblogs.com/articles/241024.html 抄在这里,方便复习! AOP技术基础   1.引言2.AOP技术基础 3.Java平台AOP技术研究4 ...

  4. 1.3 History of Android Plug-in Programing

          In July 27, 2012 , it was the first milestone in Android plug-in technology. Yimin Tu(mmin18 o ...

  5. Chapter 1: Plug-in programing from past to the future

    It is the best time. Although the internal API of Android not allowed to be modified by google play, ...

  6. 动态规划——DP算法(Dynamic Programing)

    一.斐波那契数列(递归VS动态规划) 1.斐波那契数列——递归实现(python语言)——自顶向下 递归调用是非常耗费内存的,程序虽然简洁可是算法复杂度为O(2^n),当n很大时,程序运行很慢,甚至内 ...

  7. Socket programing(make a chat software) summary 1:How to accsess LAN from WAN

    First we should know some basic conceptions about network: 1.Every PC is supposed to have its own IP ...

  8. First step to Signal —— in Linux C Programing

    1. What's signal 信号是软件中断,提供了一种处理异步事件的方法.(见<Unix环境高级编程>)一般使用时需包含 signal.h 库. 每个信号命名由SIG开头,实际值为正 ...

  9. expert C Programing notes

    1.寻常算术转换 在运算中 如果其中一个操作数是long double 则另一个转为long double,其次 如果有一个为double 则另一个转为double,再次 float . unsign ...

  10. programing Python --Sys module

    Recall that every python module has a built_in __name__ variable that python sets to the __main__ st ...

随机推荐

  1. SpringMVC PathVariable和post、get、put、delete请求

    1.PathVariable 可以映射URL中的占位符到目标方法的参数中. 2.Rest风格的URL 以CRUD为例: 新增:/order POST 修改:/order/id PUT 获取:/orde ...

  2. git和github新手安装使用教程(三步入门)

    git和github新手安装使用教程(三步入门) 对于新手来说,每次更换设备时,github的安装和配置都会耗费大量时间.主要原因是每次安装时都只关心了[怎么做],而忘记了记住[为什么].本文从操作的 ...

  3. 虚拟机迁移(QEMU动态迁移,Libvirt动(静)态迁移)

    动静态迁移的原理 静态迁移是指在虚拟机关闭或暂停的情况下,将源宿主机上虚拟机的磁盘文件和配置文件拷贝到目标宿主机上.这种方式需要显式的停止虚拟机运行,对服务可用性要求高的需求不合适. *** 动态迁移 ...

  4. 【转载】mysql binlog日志自动清理及手动删除

    说明:当开启mysql数据库主从时,会产生大量如mysql-bin.00000* log的文件,这会大量耗费您的硬盘空间.mysql-bin.000001mysql-bin.000002mysql-b ...

  5. Java与算法之(13) - 二叉搜索树

    查找是指在一批记录中找出满足指定条件的某一记录的过程,例如在数组{ 8, 4, 12, 2, 6, 10, 14, 1, 3, 5, 7, 9, 11, 13, 15 }中查找数字15,实现代码很简单 ...

  6. Vijos P1103 校门外的树【线段树,模拟】

    校门外的树 描述 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0,1,2,……, ...

  7. hdu_2670Girl Love Value(dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2670 Girl Love Value Time Limit: 2000/1000 MS (Java/O ...

  8. float浮动属性的基本常识

    CSS 浮动 请看下图,当把框 1 向右浮动时,它脱离文档流并且向右移动,直到它的右边缘碰到包含框的右边缘: 再请看下图,当框 1 向左浮动时,它脱离文档流并且向左移动,直到它的左边缘碰到包含框的左边 ...

  9. python学习之总结

    迭代器: def gen(): a = 100 yield a a = a * 8 yield a yield 1000 for i in gen(): print(i) 创建一个函数,循环体,yie ...

  10. Thinking in Java学习笔记-泛型和类型安全的容器

    示例: public class Apple { private static long counter; private final long id = counter++; public long ...