win32位下汇编编译技巧(附汇编常见错误代码)

来源:互联网 发布:javascript次方怎么办 编辑:程序博客网 时间:2024/05/09 23:48

使用MASM软件编写汇编的时候,不得不面临在命令行下敲各种命令。这对于我们现在这些对windows命令不太熟悉的人来说有点繁琐和难懂。为了方便,我把在windows下使用MASM软件编译调试汇编程序的全过程用批处理写了出来。

@echo off:kcls@echo   .@echo   .echo    *************************************************************************echo    *     please enter the source file name (Not to bring the extension)    *echo    *************************************************************************set /p name=   the source filename is:if not exist %name%.asm goto st:sclsecho .echo .echo     ********************* start menu ***********************echo         1----------masm link and debug %name%...           echo         2----------debug %name%.exe                   echo         3----------run %name%.exe         echo         4----------edit %name%.asmecho         5----------open %name%.asm with note.exe              echo         6----------masm other source file  echo         7----------delete %name%.obj %name%.exe   echo         8----------exit                       echo     ********************************************************echo .set /p ID=please choose you op:clsif "%id%"=="1" goto mif "%id%"=="2" goto dIF "%id%"=="8" exitif "%id%"=="3" goto rif "%id%"=="4" QE %name%.asmif "%id%"=="6" goto kif "%id%"=="5" start %name%.asmif "%id%"=="7" goto deletegoto s:mecho -----------masm %name%.asm------------masm %name%echo -----------link %name%.obj------------link %name%:decho -----------debug %name%.exe-----------debug %name%.exegoto s:recho -----------now %name%.exe is running-------------%name%.exeecho -------------%name%.exe run over-----------------pausegoto s:stclsecho .echo **********************************************************************echo          Not Exit %name%.asm, Do you want continue?      echo **********************************************************************set m=Yset /p m=N for exit and others for continue:if %m%==N exitgoto kCLSecho --------please enter the source file name (Not to bring the extension)----------set /p name=if not exist %name%.asm goto stgoto s:deletedel %name%.objdel %name%.exeecho -------%name%.obj %name%.exe have been deleted-----pausegoto s  


只要把这个批处理文件和masm link 汇编源文件放到一起,双击.bat文件运行即可

下面是批处理文件运行过程



提示输入源文件名 这里输入exp2(即本次试验用到的简单程序的代码文件名)




2进入主菜单


选择第一项,进行汇编连接和调试,由程序自动完成命令的输入。


反汇编后可以看出数据段段基地址为0b49h






对于初学者来说,汇编代码的调试是一个艰苦的过程。今天偶然见到一篇文章,总结的不错,特意做个笔记于此:

————————————————————————————————————————————————————————————

 

代码                                   错误含义


00 Block nesting error嵌套出错。嵌套的过程、段、结构、宏指令或重复块等非正常结束。例如:在嵌套语句中有外层的结束语句,而无内层的结束语句

 

01 Extra characters on line一语句行有多余字符,可能是语句中给出的参数太多

 

02 Internal error-Register already defined这是一个内部错误.若出现该错误,请记下发生的条件,并使用ProductAssistance Requst表与Microsoft公司联系.

 

03 Unknown type specifier表识符指定类型出错.例如类型字符拚错


04 Redefinition of symbol符号重定义.同一个标识符在两个位置上定义.在汇编第一遍扫描时,在这个标
识符的第二个定义位置上给出这个错误.


05 Symbol is multidefined符号重定义.同一个标识符在两个位置上定义.在汇编第二遍扫描时,每当遇到
这个标识符都给出这个错误.


06 Phase error betwween passes 两次扫描不同.一个标号在二次扫描时得到不同的地址值,就会给出这种
错误.:在启动MASM时使用/D任选项,产生第一遍扫描的列表文件,它可帮助你查找这种错误.


07 Already had ELSEclause已有ELSE语句.在一个条件块里使用多于一个的ELSE语句.


08 Must be in conditional block没有在条件块里.通常是有ENDIFELSE语句,而无IF语句


09 Synbol not defined符号未定义.在程序中引用了未定义的标识符.


10 Syntax error语法错误.不是汇编所能识别的一个语句.


11  Type illegal in context指定非法类型.例如:指定过程TYPE类型,而不是NEARFAR.


12 Group name must be unique组名应是唯一的.


13 Must be declared during pass 1必须在第一遍扫描期间定义.


14 Illegal public declaration一个标识符被非法的指定为PUBLIC类型.


15 Symmol already different kind重新定义一个符号为不同种类符号.例如:一个段名重新当作变量名定义
使用.


16 Reserved word used as symbol把汇编语言规定的保留字作标识符使用.


17 Forward reference illegal非法的前向引用.


18 Operand musr be register操作数位置上应是寄存器,但出现标识符.


19 Wrong type of register使用的寄存器类型出错.


20 Operand must be segment or group应该给出一个段名或组名(grup).


21 Symbol has no segment不知道标识符的段属性.


22 Operand must be type specifier操作数应出类型说明符 

 


23 Symbol already defined locally已被指定为内部(Local)的标识符,企图在Extrn语句中又定义外部标
识符.


24 Segment parameters are changed段参数被改变.
 
25 Improper align/conbine type段定义时的定位类型/组合类型使用出错.
 
26 Refrence to multine symbol指令引用了多重定义的标识符.
 
27 Operand expected需要一个操作数,但只有操作符,:"MOV BX,OFFSET".
 
28 Operator expected需要一个操作符,但只有操作数
 
29 Division by 0 or overflow除以0或溢出出错.
 
30 Negative shift count运算符SHLSHR的移位表达式值为负数.
 
31 Operand type must match操作数类型不匹配.
 
32 Illegal use of external外部符号使用出错.
 
33 Must be record field name应为记录字段名.
 
34 Must be record name or record field name应为记录字段名或记录名,在记录字段名或记录名位置上
出现另外的符号.
 
35 Operand must have size应指明操作数的长度(BYTE,WORD).通常使用PTR运算符可改正错误.
 
36 Must be variable,lableor constant应该是变量名,标号,常数的位置上出现了其他信息.
 
37 Must be structure field name应为结构字段名.在结构字段名位置上出现另外的符号.
 
38 Left operand must be segment操作数的左边应是段的信息.
 
39 One operand must be constant操作数必须是常数.
 
40 Operand must be in same segment or one constant"-"运算符用错.
 
41 Normal type operand expected要求给出一个正常的操作数.
 
42 Constant expected要求给出一个常数.
 
43 Operand must have segment运算符SEG用错.
 
44 Must be associated with data在必须与数据段有关的位置上出现了代码段有关的项.例如:MOV
AX,LENGTH CS:VAR".其中VAR是数据段中的变量名.
 
45 Must be associated with code在必须与代码段有关的位置上出现了数据段有关的项.
 
46 Multiple base registers同时使用了多个基址寄存器.
 
47 Multiple index registers同时使用了多个变址寄存器.
 
48 Must be index orbase register指令仅要求使用基址或变址寄存器,而不能用其他寄存器.例如:"MOV
AX,[SI+CX]"
 
49 Illegal use of register非法使用寄存器出错
 
50 Value is out of range数值太大.
 
51 Operand not in current CS ASSUME segment操作数不在当前代码段内.
 
52 Improper operand type操作数类型使用不当.
 
53 Jump out of range by %ld byte(s) 条件转移指令跳转范围超过-128+127个字节.
 
54 Index displacement must be constant变址寻址的位移量必须是常数.
 
55 Illegal register value非法寄存器的值.目标代码中表达寄存的值超过’7’.
 
56 Immediate mode illegal不合法的立即数寻址方式.
 
57 Illegal size for operand使用的操作数太小(字节数)出错.
 
58 Byte register illegal要求用字寄存器而使用了字节寄存器.
 
59 Illegal use of CS register指令中错误的使用段寄存器.
 
60 Must be accumulator register要求用AXAL的位置上出现了其他寄存器.
 
61 Improper use of segment register不允许用段寄存器的位置上使用了段寄存器.
 
62 Missing or unrechable CS试图跳转去执行一个CS达不到的标号.
 
63 Operand combination illegal双操作数指令指令中二个操作数组合出错.
 
64 Near JMP/CALL to different cs试图用NEAR属性的转移指令跳转到不在当前段的一个地址.
 
65 Label cannot have segment override段前缀使用出错.
 
66 Must have instruction after prefix在重复前缀REG,REPE,REPNE的后面必须有指令.
 
67 Cannot override ES for destination串操作指令中目的操作数不能用其他段寄存器替代ES.
 
68 Cannot address with segment register指令中寻找一个操作数,ASSUME语句中未指明哪个段寄存器
与操作数所在段有关联
 
69 Must be in segment block指令语句没有在段内.
 
70 Cannot use EVEN or ALIGN with byte alignment在段定义的定位类型中选用BYTE,这时不能使用EVEN
ALIGN伪指令.
 
71 Forward needs override or FAR转移指令的目标没有在源程序中说明为FAR属性,可用PTR指定.
 
72 Illegal value for DUP count操作符DUP前的重复次数是非法的(例如负数)或未定义.
 
73 Symbol is already external在模块内试图定义的符号,它已在外部符号伪指令中说明.
 
74 DUP nesting too deep操作符DUP嵌套太深.
 
75 Illegal use of undefined operand(?)不定操作符’?’使用不当.
 
76 Too may value for structure or record initialization在定义结构变量或记录时,初始值太多.
 
77 Angle brackets required around initialized list定义结构变量时,初始值未用尖括号"<>"括起来.
 
78 Directie illegal in structure在结构定义中的语句伪指令使用不当.
 
79 Override with DUP illegal在结构变量初始值表中使用DUP操作符出错.
 
80 Field cannot be overridden在定义结构变量语句中试图对一个不允许修改的字段设置初值.
 
81 Override is of wrong type在定义结构变量语句中设置初值时类型出错
 
82 Circular chain of EQU aliases用等值语句定义的符号名,最后又指向它自己.
 
83 Cannot emulate coprocessor opcode访真器不能支持的8087协处理器操作码.
 
84 End of file,no END directive源程序无END语句.
 
85 Data emitted with no segment数据语句没有在段内.

 



0 0