[这个贴子最后由一生逍遥在 2006/11/21 10:31pm 第 6 次编辑]
DATAS SEGMENT;定义数据段
FIVE DB 5
;定义了一个8位的数据05H,H表示十六进制,2的4次方=16,格式:名字 DB 值
;其实这行还有故事。。。这里不讲了
;所以8位的数据恰好可以用两位十六进制数表示。
;在计算机中,一个字节由8个二进制数构成,如00000000B,11111111B表示数值15
DATAS ENDS;定义数据段结束
STACKS SEGMENT;定义栈段,这回是空的
STACKS ENDS;定义栈段结束
CODES SEGMENT;定义代码段
ASSUME CS:CODES,DS:DATAS,SS:STACKS
;ASSUME:假定,CS,DS,SS这些字都是不能随便更改,更改就出错
;现在来说说它的意思
;它通知汇编程序,嘿,CODES这个段,由CS寄存器去寻址……(寄存器概念不懂跳过)
;寻址?这么说吧,一个和尚,住在一庙里;要找这和尚,得知道先知道庙啊
;知道了这庙,再报他的名号,就找到它了。这里的ASSUME就相当与告诉汇编程序,
;你要找CODES里面的东西,就得通过CS这个庙!!
START: ;带有标号的语句行,标识符(START)+“:”,
;以后会接触到,嘿,你回到那行去
MOV AX,DATAS
;把DATAS->AX,MOV表示把第二个值等传给第一个(寄存器),MOV后面的这两个东东叫做
;操作数,第一个叫目的操作数,第二个叫源操作数
;这里注意:两个操作数长度(位数)要相同,中间用逗号隔开
;AX叫累计器,它是16位的,高(左边)8位叫AH,低(右边)8位叫AL
;这时候AX不为0000H,这是必然地
;段名,组名,宏命令名的“内容”是该段/组/宏首地址
MOV DS,AX
;不必再解释了吧
;前面这两行的功能要说一下,第一行,把DATAS(即数据段的首地址传给AX),第二行把
;数据段的首地址传给了DS,通过首地址和偏移地址(EA,和尚的名号)就可以找到数据
MOV AL,FIVE;把FIVE的数据->AL,刚才说过了,AX的低8位,FIVE的内容是05H
;AX的低8位被05H代替了,也就是原来的数据没了
ADD AL,3
;把AL+3->AL,如果不讨论标志的问题,ADD 命令也就这样了,把源操作数加上目的操作数
;再把这和给目的操作数
ADD AX,30H
;呵呵,为什么加30H,把数字加上30H,就是该数值的ASCII代码了查查看,可以试下如果
;我们的和超过10会怎么样~~
MOV DL,AL
;从这句开始,我们就要把结果AL输出了,这里用到了DOS功能调用
;要输出AL,我们必须为应用这个调用做好准备
;我们必须把要输出的字符的ASCII代码传给DL,把功能号02H(呵呵,实际上也就是2),
;传给AH,这是规定滴。对于不同的功能号,有不同的要求。这次针对的是02H
MOV AH,2
INT 21H
;开始调用
MOV AH,4CH
INT 21H
;又准备调用,4CH是什么?
;返回调用进程 (AL=返回码)
;记得回家,不然你的程序会很不高兴地
CODES ENDS;定义代码段结束
END START ;表示结束程序,可是试把start全部改成任意一个标识,结果也是一样的
;顺便说一下,标识符的头一定要字母或下划线
;代码段的头和尾要配对,结束程序的语句是在代码段尾部的后面
如有错漏,欢迎指正!讨论,提问,欢迎跟帖! |