您的位置:首页 > 编程语言

一个简单的汇编程序(hello world )

2012-06-06 12:27 267 查看
一个简单的汇编程序(hello world )

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 地址范围 对指定范围内的存储单元进行反汇编

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: