当我们想任意显示字符串,如:UNDERSTAND?,则可以使用DOS21H号中断9H号功能。输 入下行程序,存盘并执行看看: 1.输入 A100 MOV DX,109 ;DSX = 字符串的起始地址 MOV AH,9 ;DOS的09h功能调用 INT 21 ;字符串输出 INT 20 DB 'UNDERSTAND?$';定义字符串 在汇编语言中,有两种不同的指令:1.正规指令:如 MOV 等,是属于CPU的指令,用来 告诉CPU在程序执行时应做些什么,所以它会以运算码(OP-code)的方式存入内存中; 2.伪指令:如DB等,是属于DEBUG等编译器的指令,用来告诉编译器在编译时应做些什 么。DB(Define Byte)指令用来告诉DEBUG 将单引号内的所有ASCII 码放入内存中。 使用 9H 功能的字符串必须以$结尾。用D命令可用来查看DB伪指令将那些内容放入内 存。 6.输入 D100 1975:0100 BA 09 01 B4 09 CD 21 CD-20 75 6E 64 65 72 73 74 ......!. underst 1975:0110 61 6E 64 24 8B 46 F8 89-45 04 8B 46 34 00 64 19 and$.F..E..F4.d. 1975:0120 89 45 02 33 C0 5E 5F C9-C3 00 C8 04 00 00 57 56 .E.3.^_.......WV 1975:0130 6B F8 0E 81 C7 FE 53 8B-DF 8B C2 E8 32 FE 0B C0 k.....S.....2... 1975:0140 74 05 33 C0 99 EB 17 8B-45 0C E8 D4 97 8B F0 89 t.3.....E....... 1975:0150 56 FE 0B D0 74 EC 8B 45-08 03 C6 8B 56 FE 5E 5F V...t..E....V.^_ 1975:0160 C9 C3 C8 02 00 00 6B D8-0E 81 C3 FE 53 89 5E FE ......k.....S.^. 1975:0170 8B C2 E8 FB FD 0B C0 75-09 8B 5E FE 8B 47 0C E8 .......u..^..G..
现在,我们来剖析另一个程序:由键盘输入任意字符串,然后显示出来。db 20指示DEB UG保留20h个未用的内存空间供缓冲区使用。 输入A100 MOV DX,0116 ;DSX = 缓冲区地址,由DB伪指令确定缓冲区地址 MOV AH,0A ;0Ah 号功能调用 INT 21 ;键盘输入缓冲区 MOV DL,0A ;由于功能Ah在每个字符串最后加一个归位码(0Dh由 Enter MOV AH,02 ;产生),使光标自动回到输入行的最前端,为了使新输出的 INT 21 ;字符串不会盖掉原来输入的字符串,所以利用功能2h加一 ;个换行码(OAh),使得光标移到下一行的的最前端。 MOV DX,0118 ;装入字符串的起始位置 MOV AH,09 ;9h功能遇到$符号才会停止输出,故字符串最后必须加上 INT 21 ;$,否则9h功能会继续将内存中的无用数据胡乱显示出来 INT 20 DB 20 ;定义缓冲区 送你一句话:学汇编切忌心浮气燥。
客套话就不讲了。工欲善其事,必先利其器。与其说DEBUG 是编译器,倒不如说它是 “直译器”,DEBUG的A命令只可将一行汇编指令转成机器语言,且立刻执行。真正编译 器(MASM)的运作是利用文本编辑器(EDIT等)将汇编指令建成一个独立且附加名为.A SM的文本文件,称源程序。它是MASM 程序的输入部分。MASM将输入的ASM文件,编译成 .OBJ文件,称为目标程序。OBJ文件仅包含有关程序各部份要载入何处及如何与其他程序 合并的信息,无法直接载入内存执行。链结程序LINK则可将OBJ文件转换成可载入内存执 行(EXEcute)的EXE文件。还可以用EXE2BIN,将符合条件的EXE文件转成COM文件(COM 文件不但占用的内存最少,而且运行速度最快)。 下面我们用MASM写一个与用DEBUG写的第一个程序功能一样的程序。 用EDIT编辑一个SMILE.ASM的源程序文件。 源程序 DEBUG 程序 prognam segment assume cs:prognam org 100h A100 mov dl,1 mov dl,1 mov ah,2 mov ah,2 int 21h int 21 int 20h int 20 prognam ends end
比较一下:1.因为MASM会将所有的数值假设为十进制,而DEBUG则只使用十六进制,所 以在源程序中,我们必须在有关数字后加上代表进制的字母,如H代表十六进制,D代表 十进制。若是以字母开头的十六进制数字,还必须在字母前加个0,以表示它是数,如 0AH。2.源程序增加五行叙述:prognam segment 与 prognam ends 是成对的,用来告 诉 MASM 及LINK,此程序将放在一个称为PROGNAM(PROGram NAMe)的程序段内,其中段 名(PROGNAM)可以任取,但其位置必须固定。assume cs:prognam 必须在程序的开头 ,用来告诉编译器此程序所在段的位置放在CS寄存器中。end用来告诉MASM,程序到此 结束, ORG 100H作用相当于DEBUG的A100,从偏移量100开始汇编。COM 文件的所有源程 序都必须包含这五行,且必须依相同的次序及位置出现,这点东西记下就行,千篇一律 。接着,我们用MASM编译SMILE.ASM。 输入 MASM SMILE ←不用打入附加名.ASM。 Microsoft (R) Macro Assembler Version 5.10 Copyright (C) Microsoft Corp 1981, 1988. All rights reserved. Object filename [SMILE.OBJ]: ←是否改动输出OBJ文件名,如不改就ENTER Source listing [NUL.LST]: ← 是否需要列表文件(LST),不需要就ENTER Cross-reference [NUL.CRF]: ←是否需要对照文件(CRF),不需要则ENTER 50162 + 403867 Bytes symbol space free 0 Warning Errors ←警告错误,表示编译器对某些语句不理解,通常是输入错误。 0 Severe Errors ←严重错误,会造成程序无法执行,通常是语法结构错误。
如果没有一个错误存在,即可生成OBJ文件。OBJ中包含的是编译后的二进制结果,它还 无法被 DOS载入内存中加以执行,必须加以链结(Linking)。以LINK将OBJ文件(SMIL E.OBJ)链结成 EXE 文件(SMILE.EXE)时,。 1.输入 LINK SMILE ←不用附加名OBJ Microsoft (R) Overlay Linker Version 3.64 Copyright (C) Microsoft Corp 1981, 1988. All rights reserved. Run File [SMILE.EXE]: ← 是否改动输出EXE文件名,如不改就ENTER List File [NUL.MAP]: ← 是否需要列表文件(MAP),不需要则ENTER Libraries [.LIB]: ←是否需要库文件,要就键入文件名,不要则ENTER LINK : warning L4021: no stack segment← 由于COM文件不使用堆栈段,所以错误信 息 ←"no stack segment"并不影响程序正常执行
至此已经生成EXE文件,我们还须使用EXE2BIN 将EXE文件(SMILE.EXE),转换成COM文 件(SMILE.COM)。输入EXE2BIN SMILE产生 BIN 文件(SMILE.BIN)。其实 BIN 文件 与 COM 文件是完全相同的,但由于DOS只认COM、EXE及BAT文件,所以BIN文件无法被正 确执行,改名或直接输入 EXE2BIN SMILE SMILE.COM即可。现在,磁盘上应该有 SMIL E.COM 文件了,你只要在提示符号C:>下,直接输入文件名称 SMILE ,就可以执行这 个程序了。
用户428453 2014-10-13 20:28
用户387618 2011-9-12 16:21
用户114930 2007-11-19 16:06
好贴!我转载到我的空间里!嘿嘿
有机会楼主多交流哈!