如何在内存中编辑和执行汇编程序一、UsingTheDEBUGProgram1.StartingDEBUG⑴.Someexamples①C>DEBUGCCCC.EXE↙-②C>DEBUGB:\CCCC·EXE↙-③C>DEBUG↙-NCCCC·EXE↙-L↙-⑵.TheInitialValueAfterStartingDEBUGDEBUG程序起动后,把各寄存器和标志位置成以下状态:①SegmentRegister(CS、DS、ES和SS)=自由存贮空间的底部,即DEBUG程序结束以后的第一个段。②IP=0100H。③SP=段尾或装载程序临时区底部(两者中取较低的一个)④AX、BX、CX、DX、BP、SI、DI=0若调入DEBUG时指定了文件名,则BX(高位)+CX=文件长度的字节数。⑤标志位置都为清除状态。DebugCS、DS、ES、SSIP内存高端内存低端............CS:100段尾SP段首64KB自由空间中的一个段2.AnAssemblylanguageExampleDisplayingaCharacter3onScreen:①KeyinginProgramInstructionsandData:C:\DEBUG↙(进入DEBUG)-A100↙(进入汇编状态)XXXX:0100MOVDL,33↙(数字3的ASCII码)XXXX:0102MOVAH,2↙XXXX:0104INT21↙(调用2号功能在屏上显示DL中字符)XXXX:0106INT20↙(正常结束中断)XXXX:0108↙(回车,结束汇编状态)-G↙(运行当前汇编程序)3(Display)Programterminatednormally②UnAssemble-U100,108↙XXXX:0100B233MOVDL,33XXXX:0102B402MOVAH,2XXXX:0104CD21INT21XXXX:0106CD20INT20XXXX:0108③SavingaProgramfromwithinDEBUG-RBX↙BX0000:↙-RCX↙CX0000:8↙(程序大小)-NW3.COM↙(命名)-W↙(存盘)④ExitDEBUG-Q↙C_二、DEBUGCommandsRulesofDEBUGCommands:①所有命令均为一单字母,其后跟一个或多个参数。②命令和参数可大写、小写或大、小写混合方式输入。③命令与参数间可用空格或逗号隔开。④修改软件时注意,DEBUG不能改写·EXE类型的文件。所以,如果需要改写,就必须事先将EXE文件的后缀改名,待修改后再恢复原来名字。⑤命令参数中都以16进制数表示。⑥参数中字符的引号可用双引号,也可用单引号。1.AssembleFunction:Assemblesymbolicinstructionsintomachinecode.Format:A[Address]Theparameter“Address”:用字母表示的段寄存器标志加上偏移值,例如“ACS:100”一个段地址,加上一个偏移值,例如“A4AB:100”。仅有一个偏移值,例如“A100”。ForExample:在屏上显示“梅花”CDEBUG↙-A↙08FE∶0100MOVAH,02↙08FE∶0102MOVDL,05↙08FE∶0104INT21↙(调用2号功能显示DL中字符)08FE∶0106INT20↙08FE∶0108↙-RCX↙CX0000:8↙-NA.COM↙-W↙-Q↙Execution:CA.COM↙2.UnassembleFunction:Unassemblemachinecodeintosymboliccode.Format:U[地址]——Unassemblebeginsatspecificaddress.U〈范围〉——Unassemblewithinspecificarea.ForExample1:C>DEBUGKEY·EXE↙-U↙(隐含从当前指针开始)0C1C∶000050PUSHAX↙...-U0000L13↙(从0000开始13个单元)-U0000DF3↙(从0000~DF3)ForExample2:CDEBUGWS.COM11.TXT↙(反汇编存盘)-U100FFFF↙......-Q↙(红框内的字符不可见)C_3.DumpFunction:Displaythecontentsofareaofmemory.Format:—D[地址]-D〈范围〉ForExample:-D0000L1F↙(显示从0000开始的1F字节内容)-D40:13↙(显示基本内存大小)-DFFFF:5↙(CheckingROMBIOSDate)FFFF:0000CD19E000F030362F-31362F393800FCBD.....06/16/98...4.EnterFunction:Enterdataintomemory,beginningataspecificlocation.Format:E〈地址〉〈内容表〉E〈地址〉ForExample1:-EDS:100F2,“XYZ”,8D↙(代替指定地址开始单元内容)ForExample2:-EDS∶100↙09BC∶010000.3000.3100.3200.↙(回车结束)Note:ForExample2格式有三种操作方式:①按空格键————上一个替换完成,并显示下一个单元的内容。如要修改,则键入新的字节,如不修改,则只按空格键。②输入一个减号(“-”)————显示前一单元的内容,可进行修改。连续使用“-”号、可不断地反方向修改。③按回车键——结束E命令。5.RegisterFunction:Displayandmodificationthecontentsofoneormoreregisters.Format:R命令有三种功能格式:①-R——显示所有寄存器及标志位内容。②-R〈寄存器名〉——显示和修改一个指定的寄存器的内容。ForExample:-RAX↙AXF1F4:3B↙此时,可选择以下操作之一:a.若不改变其内容,则直接按回车键。b.若要改变内容,可用1~4个16进制值代替原值,再回车。③-RF——显示和修改标志位态。ForExample:-RF↙NVUPEIPLNZNAPONC-此时,可采用以下两种操作之一:a.若不需要修改,直接按回车键。b.若有一个或多个标志要修改,则可输入此标志的相反值。输入标志的次序是无关的,输入各标志之间可以没有空格,输入完毕,按回车键。即-PONZDINV↙PWS中的标志符号表示置1:置0:状态:-RF↙NVUPEIPLZRNAPENC-OF溢出DF方向IF中断SF符号ZF零AF辅助PF奇偶CF进位OVNV有/无DPUP减/增EIDI开/关NGPL负/正ZRNZ零/非ACNA有/无PEPO奇/偶CYNC有/无6.GoFunction:RuntheexecutableprogramInmemory.Format:G[=〈始地址〉][〈断点〉…]C>DEBUGB:KGY.EXE↙-G=023↙(在地址CS:0023中断)7.TraceFunction:Tracetheexecutionofoneinstruction.Format:T[=地址]——执行CS:IP或指定地址处的指令。T[=地址][n]——执行指定地址后n条指令。ForExample:-T03↙(执行CS:IP后3条指令)-T=CS:0F3B↙(执行地址CS:0F3B处指令)8.SearchFunction:Searchaaddressofspecifycontent.Format:S〈地址范围〉〈内容表〉ForExample1:-S1001206↙(在DS∶100~120的范围内查找06H地址)08FF∶0101(查得08FF∶0101内存单元的内容为06H)ForExample2:-SCS∶00010041“XYZ”↙〖28-17〗9.CompareFunction:Comparethecontentbetweentwomemoryarea.Format:-C〈源地址范围〉〈目的地址〉DisplayFormat:〈源地址〉〈源内容〉〈目标内容〉〈目标地址〉ForExample1:-CCS∶100L20200↙08FF∶0105000608FF∶0205Note:以CS∶100为内存首地址的32个(20H)字节与以CS∶200为首地址的32个字节进行比较。其中的CS∶105内容“00”与CS∶205内容“06”不同。〖28-18〗10.FillFunction:Fillthecontenttospecifymemoryunit.Format:F〈地址范围〉〈内容表〉ForExample:-F04BA∶100L5F3“XYZ”8D↙(用指定的5个字节填入04BA:100开始的5个内存单元)Note:若内容表中的字节数少于地址范围,则内容表被重复使用,直到指定范围被填满为止;若内容表的字节数大于地址范围,则多余的内容被忽略。〖28-19〗11.MoveFunction:Movethecontentfromspecifymemoryareatoanother.Format:M〈源地址范围〉〈目的地址〉ForExample1:-MCS∶100110500↙(将CS∶100~110共17个字节内容搬到DS∶500开始的内存区)ForExample2:-MCS∶100110CS∶105↙-MCS∶100110CS∶0F5↙目的地址与源地址可以重迭,但重迭部分原来内容被覆盖。例,在程序中插入一段指令:插入结束插入点插入移动后再移回12.HexarithmeticFunction:计算两个16进制数的和与差。Format:H〈值〉〈值〉ForExample:-H0F8↙00170007(表示0FH+8H=0017H,0FH-08H=0007H)13.NameFunction:Nameaprogram.Format:N〈文件标识符〉[〈文件标识符〉……]ForExample:A>DEBUG↙-Nb:myprog↙-L↙〖28-21〗14.LoadFunction:Loadaprogramtomemory.Format:L〈起址〉〈驱动器号〉〈扇区号〉〈扇区数〉L[地址](装入文件到指定地址,省地址则为CS:0100)ForExample1:-LCS:1200053↙(“0”为A盘)ForExample2:-NB:XEARCH.EXE↙;设置文件标识符-L↙;读入文件……-RBX↙;检查文件长度BX0000:↙-RCX↙CX014A;原文件长度为014AH字节:012E↙;修改文件长度为012EH字节-W↙;写盘命令(Write)〖28-22〗15.WriteFunction:Writeaprogramontodisk.Format:W〈起址〉〈驱动器号〉〈扇区号〉〈扇区数〉——把数据写到指定的区段W[地址]——把指定的内存中数据写入文件中-NB:PROG↙;设置文件标识符-L↙……-RBX↙;修改BX、CX的内容BX0000:0↙;文件长度的高位字节数-RCX↙CX001F;文件长度的低位字节数:22↙-W↙;写入磁盘。〖28-23〗Note:•Writeprogramfilesonlywitha.comextenstion,becauseWdoesnotsupportthe.exeformat.•tomodifya.exeprogram,youmaychangetheextensiontemporarily.16.InputFunction:Getdatafromaport(某端口).Format:I〈端口地址〉ForExample:-I2F8↙6B(表示从端口02F8取得的数据为6BH)17.OutputFunction:Outputdatatoaspecialport(指定端口).Format:O〈端口地址〉〈字节〉ForExample:-O2F84F↙(把字节值4FH送到端口2