看了这么多天了,终于可以写出一个,hello world 了,激动啊。
;Author:sunyonggao
;Description:在dos下显示一句话
;入口参数: ah=09H
;ds:dx=待输出字符的地址
;说明:待显示的字符串以’$’作为其结束标志
data segment
str db 'Hello,This is my first asm program',0ah,0dh,'press any key to exit',0dh,0ah,'$'
data ends
code segment
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax; 初始化数据段
mov dx,offset str
mov ah,09h
int 21h; 21中断的9好功能 显示字符串
mov ah,1
int 21h
;调用21H中断的1号功能,将键盘输入的字符ASC码存在al寄存器
;用于让用户看到显示结果
mov ah,4ch
int 21h;程序结束,返回dos
code ends
end start
几点注意事项:
一 名字项
源程序中用下列字符来表示名字
字母A — Z
数字0 — 9
专用字符?、·、@、一、$
注意:(1)除数字外,所有字符都可以放在源语句的第一个位置。
(2)名字中如果用到·则必须是第一个字符。
(3)可以用很多字符来说明名字,但只有前面的31个字符能被汇编程序所识别。
用途:名字项可以是标号或变量。它们都用来表示本语句的符号地址,它是可有可无的,只有当需要用符号地址来访问该语句时它才需要出现。
·标号:标号在代码段中定义,后面跟冒号:,它也可以用LABEL或EQU伪操作来定义。此外它还可以作为过程名定义。标号经常在转移指令或CALL指令的操作数字段出现,用以表示转向地址。
标号有三种属性;段、偏移及类型。
段属性:定义标号的段起始地址,此值必须在一个段寄存器中。而标号的段则总是在CS寄存器中。
偏移属性:标号的偏移地址是16位无符号数,它代表从段起始地址到定义标号的位置之间的字节数。
类型属性:用来指出该标号是在本段内引用还是在其它段中引用的。如在段内引用的,则称为NEAR,指针长度为2字节:如在段外引用,则称为FAR,指针长度为4字节。
在程序中同样的标号或变量的定义只允许出现一次,否则汇编程序会指示出错。
二 操作符
1.算术操作符有十、一、*、/和MOD。其中MOD是指除法运算后得到的余数,如19/7的商是2,而19 MOD 7则为5(余数)
算术操作符可以用于数字表达式或地址表达式中,但当它用于地址表达式时,只有当其结果有明确的物理意义时其结果才是有效的。例如两个地址相乘或相除是无意义的。
例: 如数组ARRAY定义,如下试写出把数组长度(字数)存入CX寄存器的指令。
ARRAY DW 1,2,3,4,5,6,7
ENDB DW ?
其中END是为计算数组长度而建立的符号地址,所需指令如下
MOV CX ,(ENDB—ARRAY)/2
2。关系操作符
它有EQ(相等)、NE(不等)、LT(小于)、GT(大于)、LE(小于或等于)、GE(大于或等于)6种。