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. java的Xmx是设置什么的?

    我们使用java -X可以看到java的-X系列的参数,Xmx和Xms是相对应的.一个是memory max(Xmx) 一个是memory start (Xms). Xmx代表程序最大可以从操作系统中 ...

  2. BASIC-3 字母图形 循环 字符串

      基础练习 字母图形   时间限制:1.0s   内存限制:256.0MB        问题描述 利用字母可以组成一些美丽的图形,下面给出了一个例子: ABCDEFG BABCDEF CBABCD ...

  3. python如何玩“跳一跳”!(windows安桌版本请进!)

    最近"跳一跳",很火爆,有木有? 看了一下网上的教程,动作搭建了一下环境,就可以用脚本自动跑起来啦!!! 下面说一下android手机的实现过程: 首先,是python环境的搭建 ...

  4. C#调用windows api 实现打印机控制

    using System; using System.Text; using System.Runtime.InteropServices; using System.Security; using ...

  5. BaseServer的介绍

    服务器类型 5种类型:BaseServer,TCPServer,UnixStreamServer,UDPServer,UnixDatagramServer.注意:BaseServer不直接对外服务. ...

  6. Redis Sentinel配置小记

    Sentinel是一个管理多个redis实例的工具,它可以实现对redis的监控.通知.自动故障转移.sentinel不断的检测redis实例是否可以正常工作,通过API向其他程序报告redis的状态 ...

  7. java多线程之守护线程以及Join方法

    版权声明:本文出自汪磊的博客,转载请务必注明出处. 一.守护线程概述及示例 守护线程就是为其它线程提供"守护"作用,说白了就是为其它线程服务的,比如GC线程. java程序中线程分 ...

  8. Spring+SpringMVC+MyBatis+easyUI整合优化篇

    优化篇 Spring+SpringMVC+MyBatis+easyUI整合优化篇(一)System.out.print与Log Spring+SpringMVC+MyBatis+easyUI整合优化篇 ...

  9. 在HTML页面中获取当前项目根路径的方法

    在HTML页面获取项目根路径的方法: function getRootPath(){ var curPageUrl = window.document.location.href; var rootP ...

  10. asp.net core使用Swashbuckle.AspNetCore(swagger)生成接口文档

    asp.net core中使用Swashbuckle.AspNetCore(swagger)生成接口文档 Swashbuckle.AspNetCore:swagger的asp.net core实现 项 ...