一个简单的汇编程序(hello world )
2012-06-06 12:27
267 查看
一个简单的汇编程序(hello world )
2008-02-24 20:05
2008-02-24 20:05
;hello.asm ;masm hello.asm 编译 (masm6.0以上才能编译win32程序) ;link hello.obj 连接 data segment out1 db 'Hello world$' out2 db 'My name is replicon$' data ends code segment assume cs:code;ds:data start: mov ax,data mov ds,ax lea dx,out1 mov ah,9 int 21h mov dl,0ah mov ah,2 int 21h mov dl,0dh mov ah,2 int 21h lea dx,out2 mov ah,9 int 21h mov ah,4ch int 21h code ends end start masm有一个不成文的规定,那就是在定义完数据段后,所定义的变量均向后100h个单元,需要我们将ds段寄存器置位,在程序的start:后面加上如下指令: mov ax,data mov ds,ax 下面给出一些常见出错信息,以便查对: 1、Register already defined 汇编内部出现逻辑错误 2、Unknown symbol type 在符号语句的类型中,有些不能识别的东西 3、Symbol is multi-defined 重复定义一个符号 4、Symbol not defined 符号没有定义 5、Syntax error 语句的语法与任何可识别的语法不匹配 6、Symbol is reserved word 企图非法使用一个汇编程序的保留字(例:定义add为一变量) 7、Not proper align/combine type SEGMENT参数不正确 8、One operand must be const 这是加法指令的非法使用 9、Operands must be same or 1 abs 这是减法指令的非法使用 10、Already have base register 试图重复基地址 11、Illegal size for item 引用的项的长度是非法的,(如:双字移位) 12、Illegal register value 指定的寄存器值不能放入“reg” 字段 13、Must be AX or AL 某些指令只能用AX或AL 14、Improper use of segment reg 段寄存器使用不合法(如:mov ds,0) 15、Division by 0 or overflow 给出一个用0作除数的表达式 16、value is out of range 数值大于需要使用的 17、CS register illeal usage 试图非法使用CS寄存器 18、DUP is too large for linker DUP嵌套太长,以至于从连接程序不能得到所要的记录 常用的调试命令 DEBUG FILENAME.??? 回车 其中FILENAME是主文件名,???是扩展文件名,例如我们在此前已编译好了一个文件,它的名子为:replicon.exe 要对它进行调试时就在DOS提示符下 打:DEBUG djx.exe 回车,便可见到 '-' 提示符,如无任何提示说明正确,可进行调试。 2、DEBUG调试过程中用到的DEBUG命令介绍: (注:在指令中用 [] 括起来的内容可缺省) 1)D(Dump)显示指定内存单元内容(一般用来看数据数的内容,即DS段): 格式:d[地址] 从[地址]指定的内存单元显示128个字节的内容 [地址]缺省时,显示上一个DUMP命令后面的内容 d 地址范围 显示指定范围内的内存内容。 示例:-d100 显示从DS段100H开始的内容(以十六进制显示) 2)E(Enter)修改存储单元内容(一般在DS段) 格式:e 地址 [数据] 用给定的[数据]代替指定范围的存储单元内容 e 地址 修改一个指定内存单元的内容 示例:-e ds:200 'djx'FF00AA 就可将DS段从200开始至205的内容替 换为64 6A 78 FF 00 AA 3)G(GO)运行命令 格式:-g [=地址][断点地址1 [断点地址2 ...[断点地址10]]] 从指定[地址]开始执行程序(如地址缺省从当前CS:IP开始),运行至[断点地址1]停止,显示所有寄存器及标志位内容与下一条指令,如后面还有断点,可键入g,继续执行。 示例:-g001a 则执行从当前cs:ip至001a的指令 注意:地址设置必须从指令的第一字节设起。 4)T(Trace)执行一条语句 格式: -t [=地址] 从指定[地址]起执行一条语句后停下来,显示所有寄存器内容及标志位的值与下一条指令。如[地址]缺省则从当前CS:IP开始执行 -t [=地址][value] 从指定地址起执行value条指令后停止。 5)P(proceed)执行一个循环;一个软中断或call子过程 格式:-p [=地址] 示例: mov ah,02h mov dl,41h int 21h 此时用: -p 回车后系统将显示一个字符A,如果在这不用P,而改用T,那么系统将进入INT 21H的中断调用中,出不来,这时你会误以为你的程序编错了,一定注意!! 6)R(register)显示并可修改寄存器内容 格式:-r 显示所有寄存器内容 -r 寄存器名 修改指定寄存器内容(可改:AX,BX,CX,DX,SP, BP,SI,DI,CS,DS,ES,SS,PC,IP,F) 7)U(Unassemble)反汇编 格式:-u [地址] 从指定[地址]反汇编32个字节,若[地址]缺省则从当前地址汇编32个字节。 -u 地址范围 对指定范围内的存储单元进行反汇编 |
相关文章推荐
- 【WIN32】CMake的学习总结 1——一个简单的Hello World程序
- 【Idea】Idea+SpringMVC+Maven+Tomcat搭建一个简单的hello world工程
- linux设备驱动第二篇:一个简单hello world驱动如何实现
- 使用xcode创建一个简单得hello world 程序。
- Windows Azure Cloud Service (2) 开发一个简单的Hello World
- Ophone/OMS编程:编写JIL Widget的一个最简单的例子:hello world。
- 一个简单的“HELLO WORLD”程序在操作系统中执行的过程
- Hello World,一个简单的JSR 168 portlet
- 一个简单的Activiti的hello world程序
- 用jsp写一个简单的hello world 的程序
- IDEA 创建一个简单的hello world 项目实例
- socket编程的一个简单的hello world程序
- Windows Azure Platform (十一)开发一个简单的Hello World
- linux下qt的安装和一个最简单的小程序hello world
- 【Spring】Spring-boot搭建一个简单的Hello World工程
- Struts2 开发一个简单的Hello World
- 学习扎记:一个最简单的Servlet――Hello World
- 一个最简单的hello world操作系统
- Hello World, 一个简单的Windows程式!
- Rack学习笔记一,一个简单的hello world