汇编-dup
汇编常见错误解决方法总结
汇编常见错误解决⽅法总结汇编常见错误总结Block nesting error嵌套出错.嵌套的过程,段,结构,宏指令或重复块等⾮正常结束.例如在嵌套语句中有外层的结束语句,⽽⽆内层的结束语局1Extra characters on line⼀语句⾏有多余字符,可能是语句中给出的参数太多2Internal error-Register already defined这是⼀个内部错误.如出现该错误,请记下发⽣错误的条件,并使⽤Product Assistance Request 表与Microsoft公司联系3Unkown type specifer未知的类型说明符.例如类型字符拼错,把BYTE写成BIT,NEAR写成NAER等4Redefinition of symbol符号重定义.同⼀标识符在两个位置上定义.在汇编第⼀遍扫描时,在这个标识符的第⼆个定义位置上给出这个错误5Symbol is multidefined符号多重定义.同⼀标识符在两个位置上定义.在汇编第⼆遍扫描时,每当遇到这个标识符都给出这个错误6Phase error between passes两次扫描间的遍错.⼀个标号在⼆次扫描时得到不同的地址值,就会给出这种错误.若在启动MASM时使⽤/D 任选项,产⽣第⼀遍扫描的列表⽂件,它可帮助你查找这种错误7Already had ELSE clause已有ELSE语句.在⼀个条件块⾥使⽤多于⼀个的ELSE语句8Must be in conditional block没有在条件块⾥.通常是有ENDIF或ELSE语句,⽽⽆IF 语句9Symbol not defined符号未定义,在程序中引⽤了未定义的标识符10Syntax error语法错误.不是汇编程序所能识别的⼀个语句11Type illegal in context指定⾮法类型.例如对⼀个过程指定BYTE类型,⽽不是NEAR或FAR12Group name must be unique组名应是唯⼀的.作为组名的符号作为其他符号使⽤13Must be declared during pass 1必须在第⼀遍扫描期间定义.在第⼀遍扫描期间,如⼀个符号在未定义前就引⽤,就会出现这种错误.14Illegal public declaration⼀个标识符被⾮法的指定为PUBLIC类型15Symbol already defferent kind重新定义⼀个符号为不同种类符号.例如⼀个段名重新被当作变量名定义使⽤16Reserved word used as symbol把汇编语⾔规定的保留字作标识符使⽤17Forward reference illegal⾮法的向前引⽤.在第⼀遍扫描期间,引⽤⼀个未定义符号.18Operand must be register操作数位置上应是寄存器,但出现了标识符19Wrong type of register使⽤寄存器出错20Operand must be segment or group应该给出⼀个段名或组名.例如ASSUME语句中应为某段寄存器和指定⼀个段名或组名,⽽不应是别的标号或变量名等21Symbol has no segment不知道标识符的段属性22Operand must be type specifierSymbol alread defined locally以被指定为内部的标识符,企图在EXTRN语句中⼜定义外部标识24Segment paraneters are changed段参数被改变.如同⼀标识符定义在不同段内25Improper align/combin type段定义时的定位类型/组合类型使⽤出错26Reference to multidefined symbol指令引⽤了多重定义的标识符27Operand expected需要⼀个操作数,只有操作符28Operator expected需要⼀个操作符,但只有操作数29Divdsion by 0 or overflow除以0或溢出30Negative shift count运算符SHL或SHR的移位表达式值为负数31Operand type must match操作数类型不匹配.双操作数指令的两个操作数长度不⼀致,⼀个是字节,⼀个是字32Illegal use of external外部符号使⽤出错33Must be record field name应为记录字段名.在记录字段名位置上出现另外的符号34Must be record name or field name应为记录名或记录字段名.在记录名或记录字段名位置上出现另外的符号35Operand must be sizeMust be variable,label,or constant应该是变量名,标号,或常数的位置上出现了其他信息37Must be stucture field name应该为结构字段名.在结构字段名位置上出现了另外的符号38Lefe operand must segment操作数的左边应该是段的信息.如设DA1,DA2均是变量名,下列语句就是错误的:"MOV AX,DA1:DA2".DA1位置上应使⽤某段寄存器名39One operand must constant操作数必须是常数.40Operand must be in same segment or one constant"—"运算符⽤错.例如"MOV AL,—VAR",其中VAR是变量名,应有⼀常数参加运算.⼜如两个不同段的变量名相减出错41Normal type operand expected要求给出⼀个正常的操作数.42Constant expected要求给出⼀个常数.43Operand must have segment运算符SEG⽤错.44Must be associated with data在必须与数据段有关的位置上出现了代码段有关的项45Must be associated with code在必须与代码段有关的位置上出现了数据段有关的项46Multiple base registers同时使⽤了多个基址寄存器.如"MOV AX ,[SI][BP]"47Multiple index registers同时使⽤了多个变址寄存器.如"MOV AX ,[SI][DI]"指令仅要求使⽤基址寄存器或变址寄存器,⽽不能使⽤其他寄存器.49Illegal use of register⾮法使⽤寄存器出错50Value is out of range数值太⼤,超过允许值.例如:"MOV AL ,100H"51Operand not in current CS ASSUME segment操作数不在当前代码段内.通常指转移指令的⽬标地址不在当前CS段内52Improper operand type操作数类型使⽤不当.例如:"MOV VAR1,VAR2".两个操作数均为存储器操作数,不能汇编出⽬标代码53Jump out of range by %ld byte条件转移指令跳转范围超过-128~ 127个字节.出错⼚,信息同时给出超过的字节数54Index displacement must be constant变址寻址的位移量必须是常数55Illegal register value⾮法的寄存器值.⽬标代码中表达寄存器的值超过756Immediate mode illegal不允许使⽤⽴即数寻址.例如"MOV DS,CODE"其中CODE是段名,不能把段名作为⽴即数传送给段寄存器DS 57Illegal size for operand使⽤操作数⼤⼩(字节数)出错.例如:使⽤双字的存储器操作数58Byte register illegal要求⽤字寄存器的指令使⽤了字节寄存器.如PUSH,POP指令的操作数寄存器必须是字寄存器59Illegal uer of CS register指令中错误使⽤了段寄存器CS.如:"MOV CS,AX"CS不能做⽬的操作数60Must be accumulator register要求⽤AX或AL的位置上使⽤可其他寄存器.如IN,OUT指令必须使⽤累加器AX或AL不允许使⽤段寄存器的位置上使⽤了段寄存器.如"SHL DS,1"62Missing or unreachable CS试图跳转去执⾏⼀个CS达不到的标号.通常是指缺少ASSUME语句中CS与代码段相关联63Operand combination illegal双操作数指令中两个操作数组合出错64Near JMP/CALL to different CS试图⽤NEAR属性的转移指令跳转到不在当前段的⼀个地址65Label cannot have segment override段前缀使⽤出错66Must have instuction agter prefix在重复前缀REP,REPE,REPNE后⾯必须有指令67Cannot override ES for destination串操作指令中⽬的操作数不能⽤其他段寄存器替代ES68Cannot address with srgment register指令中寻找⼀个操作数,但ASSUME语句中未指明哪个段寄存器与该操作数所在段有关联69Must be in segment block指令语句没有在段内70Cannot use EVEN or ALIGN with byte alignment在段定义伪指令的定位类型中选⽤BYTE,这时不能使⽤EVEN或ALIGN伪指令71Forward needs override or FAR转移指令的⽬标没有在源程序中说明为FAR属性,可⽤PTR指定72Illegal value for DUP count操作符DUP前的重复次数是⾮法的或未定义73Symbol id already external在模块内试图定义的符号,它已在外部符号伪指令中说明DUP nesting too deep操作数DUP的嵌套太深75Illegak use of undefinde operand( )不定操作符" "使⽤不当.例如"DB 10H DUP( 2)"76Too many valer for struc or record initialization在定义结构变量或记录变量时,初始值太多77Angle brackets requored around initialized list定义结构体变量时,初始值未⽤尖括号()括起来78Directive illegal structure在结构体定义中的伪指令使⽤不当.结构定义中的伪指令语句仅⼆种:分号(;)开始的注释语句和⽤DB,DW等数据定义伪指令语句79Override with DUP illegal在结构变量初始值表中使⽤DUP操作符出错80Field cannot be overridden在定义结构变量语句中试图对⼀个不允许修改的字段设置初值81Override id of wrong type在定义结构变量语句中设置初值时类型出错82Circular chain of EQU aliases⽤等值语句定义的符号名,最后⼜返回指向它⾃⼰.如:A EQU BB EQU A83Cannot emulate cooprocessor opcode 仿真器不能⽀持的8087协处理器操作码84End of file,not END directive 源程序⽂件⽆END⽂件85Data emitted with no segment 语句数据没有在段内86 can't open ml.err把下⾯的复制到⼀个⽂档,命名为ml.err添加到⼯程⽬录FATALcannot open fileI/O error closing fileI/O error reading fileout of memoryassembler limit : macro parameter name table fullinvalid command-line optionnesting level too deepunmatched macro nestingline too longunmatched block nestingdirective must be in control blockerror count exceeds 100; stopping assemblyinvalid numerical command-line argumenttoo many argumentsstatement too complexInternal Assembler Errormissing source filenameCOFF error writing fileinvalid debug and browser data; file exceeds line limitcannot find link.execannot find cvpack.exeSEVEREmemory operand not allowed in contextimmediate operand not allowedcannot have more than one ELSE clause per IF blockextra characters after statementsymbol type conflictsymbol redefinitionundefined symbolnon-benign record redefinitionsyntax errorsyntax error in expressioninvalid type expressiondistance invalid for word size of current segmentPROC, MACRO, or macro repeat directive must precede LOCAL .MODEL must precede this directivecannot define as public or externalsegment attributes cannot changeexpression expectedoperator expectedinvalid use of external symboloperand must be RECORD type or fieldidentifier not a recordrecord constants may not span line breaksinstruction operands must be the same sizeinstruction operand must have sizeinvalid operand size for instructionoperands must be in same segmentconstant expectedoperand must be a memory expressionexpression must be a code addressmultiple base registers not allowedmultiple index registers not allowedmust be index or base registerinvalid use of registerinvalid INVOKE argumentmust be in segment blockDUP too complextoo many initial values for structurestatement not allowed inside structure definitionmissing operand for macro operatorline too longsegment register not allowed in contextstring or text literal too longstatement too complexidentifier too longinvalid character in filemissing angle bracket or brace in literalmissing single or double quotation mark in stringempty (null) stringnondigit in numbersyntax error in floating-point constantreal or BCD number not allowedtext item requiredforced errorforced error : value equal to 0forced error : value not equal to 0forced error : symbol not definedforced error : symbol definedforced error : string blankforced error : string not blankforced error : strings equalforced error : strings not equal[ELSE]IF2/.ERR2 not allowed : single-pass assemblerstructure alignment must be 1, 2, 4, 8, or 16expectedincompatible CPU mode and segment sizeLOCK must be followed by a memory operation instruction prefix not allowedno operands allowed for this instructioninvalid instruction operandsinitializer magnitude too large for specified sizecannot access symbol in given segment or group operands have different framescannot access label through segment registersjump destination too farjump destination must specify a labelinstruction does not allow NEAR indirect addressing instruction does not allow FAR indirect addressing instruction does not allow FAR direct addressingjump distance not possible in current CPU modemissing operand after unary operatorcannot mix 16- and 32-bit registersinvalid scale valueconstant value too largeinstruction or register not accepted in current CPU mode reserved word expectedinstruction form requires 80386/486END directive required at end of filetoo many bits in RECORDpositive value expectedindex value past end of stringcount must be positive or zerocount value too largeoperand must be relocatableconstant or relocatable label expectedsegment, group, or segment register expectedsegment expectedinvalid operand for OFFSETinvalid use of external absolutesegment or group not allowedcannot add two relocatable labelscannot add memory expression and code labelsegment exceeds 64K limitinvalid type for a data declarationHIGH and LOW require immediate operandsN/Acannot have implicit far jump or call to near labeluse of register assumed to ERRORonly white space or comment can follow backslash COMMENT delimiter expectedconflicting parameter definitionPROC and prototype calling conventions conflictinvalid radix tagINVOKE argument type mismatch : argumentinvalid coprocessor registerinstructions and initialized data not allowed in AT segments /AT switch requires the TINY memory modelcannot have segment address references with TINY model language type must be specifiedPROLOGUE must be macro functionEPILOGUE must be macro procedurealternate identifier not allowed with EXTERNDEFtext macro nesting level too deepN/Amissing macro argumentEXITM used inconsistentlymacro function argument list too longN/AVARARG parameter must be last parameterVARARG parameter not allowed with LOCALVARARG parameter requires C calling conventionORG needs a constant or local offsetregister value overwritten by INVOKEstructure too large to pass with INVOKE : argumentnot overriding private proc as publictoo many arguments to INVOKEtoo few arguments to INVOKEinvalid data initializerN/ARET operand too largetoo many operands to instructioncannot have more than one .ELSE clause per .IF block expected data labelcannot nest proceduresEXPORT must be FARinvalid symbol type in expressionbyte register cannot be first operandword register cannot be first operandspecial register cannot be first operandcoprocessor register cannot be first operandcannot change size of expression computationssyntax error in control-flow directivecannot use 16-bit register with a 32-bit addressconstant value out of rangemissing right parenthesistype is wrong size for registerstructure cannot be instancednon-benign structure redefinition: label incorrectnon-benign structure redefinition: too few labels OLDSTRUCTS/NOOLDSTRUCTS state cannot be changed non-benign structure redefinition: incorrect initializersnon-benign structure redefinition: too few initializersnon-benign structure redefinition: label has incorrect offset structure field expectedunexpected literal found in expressionN/Adivide by zero in expressiondirective must appear inside a macrocannot expand macro functiontoo few bits in RECORDmacro function cannot redefine itselfN/Ainvalid qualified typefloating-point initializer on an integer variablenested structure improperly initializedinvalid use of FLATstructure improperly initializedimproper list initializationinitializer must be a string or single iteminitializer must be a single iteminitializer must be a single byteimproper use of list initializerimproper literal initializationextra characters in literal initializationmust use floating-point initializercannot use .EXIT for OS_OS2 with .8086invalid combination with segment alignmentINVOKE requires prototype for procedurecannot include structure in selfsymbol language attribute conflictnon-benign COMM redefinitionCOMM variable exceeds 64Kparameter or local cannot have void typecannot use TINY model with OS_OS2expression size must be 32 bits.EXIT does not work with 32-bit segments.STARTUP does not work with 32-bit segmentsORG directive not allowed in unionsD/Tillegal use of segment registercannot declare scoped code label as PUBLIC.MSFLOAT directive is obsolete : .MSFLOAT ignored ESC instruction is obsolete : ESC ignoredmissing operator in expressionmissing right parenthesis in expressionmissing left parenthesis in expressionreference to forward macro definition16 bit segments not allowed with /coff optionFAR not allowed in flat model comm variablesinvalid .model parameter for flat modelALIAS name is emptyGROUP directive not allowed with /coff option.FPO is not compatible with nested proceduresLEVEL 1cannot modify READONLY segmentN/Anon-unique STRUCT/UNION field used without qualification start address on END directive ignored with .STARTUP cannot ASSUME CSunknown default prologue argumenttoo many arguments in macro calloption untranslated, directive requiredinvalid command-line option value, default is used insufficent memory for /EP : /EP ignoredexpected '>' on text literalmultiple .MODEL directives found : .MODEL ignoredline number information for segment without class 'CODE'directive ignored with /coff switch/Gc switch incompatible with flat model/AT switch incompatible with flat modelinvalid command-line optiondirective ignored without /coff switchdirective ignored outside a procedureLOADDS ignored in flat modeldebug information too complex forwith /coff switch, leading underscore required for start addressLEVEL 2@@: label defined but not referencedexpression expected, assume value 0EXTERNDEF previously assumed to be externallength of symbol previously assumed to be differentsymbol previously assumed to not be in a grouptypes are differentcalling convention not supported in flat modelLEVEL 3N/Ano return from procedureN/Aconditional jump lengthenedprocedure argument or local not referencedexpression may be pass-dependentstructure contains no members87加上.386之后出现乱码应该在.model语句之后加.386使⽤的是 Masm 的话,这⾥有个约定。
《汇编语言》学习笔记6——伪指令
《汇编语⾔》学习笔记6——伪指令1.伪指令⼜称伪操作,即不能像汇编指令⼀样⽣成可执⾏的⼆进制机器代码,⽽是在汇编程序对汇编语⾔源程序进⾏汇编(编译)期间,由汇编程序执⾏。
它与C中的说明性语⾔的含义类似,起到说明作⽤,⽤来指出程序分段、数据定义、存储分配、程序开始和结束等信息,这些信息在汇编(编译)完成后就不⽤了。
但程序中没伪指令,则系统就⽆法完成编译。
2.段定义伪指令:⽤来定义各种类型的段 1.格式:段名 SEGMENT [类型参数] ...... 段名 ENDS 1.其中SEGMENT和ENDS必须成对出现,表⽰段的开始和结束。
⼀般的,段名和段的意义⼀致,便于识别。
2.段名实际就是段地址,在汇编过程中,系统给出具体的地址值,⼀个段必须有⼀个名字来标识。
3.参数是可选项(可有可⽆),⽤于指出段的边界、段的组合、类别标识,⼀般⽤于多模块程序设计中。
2.类型参数 1.定位类型 PARA 该段的起始地址必须为⼩段的⾸地址,即起始地址的16进制数最低位为0 BYTE 该段可以从任意地址开始 WORD 该段必须从字边界开始,即起始地址为偶数 DWORD 该段必须从双字边界开始,即起始地址的16进制数为最低应为4的倍数 PAGE 该段必须从页边界开始,即起始地址的16进制数最低两位为00(能被256整除) 若不指定定位类型,系统默认为PARA 2.组合类型 PRIVATE 该段为私有段,连接时不与其他同名段合并 PUBLIC 连接时可与其他模块中的同名段按顺序连接成⼀个段 COMMON 表⽰该段与其他模块中的同名段有相同的起始地址,如果连接将产⽣覆盖,连接后段的长度为同名段中的最长者 STACK 表⽰该段为堆栈段 AT 表达式 该段直接定位在表达式指出的位置上 若不指定组合类型,默认为PRIVATE 3.类型标识:在引号中给出段的类型名。
在连接时,类别标识相同的段放在连续的存储区中。
(如:"STACK"⽤啦标识该段为堆栈段) 4.END:结束标记,若碰到伪指令END则停⽌编译3.ASSUME伪指令:⽤于指明段寄存器与段的对应关系 1.格式:ASSUME 段寄存器:段名,[段寄存器:段名,段寄存器:.....]【[]中标识可选项】 2.除了代码段寄存器CS不能⽤MOV指令赋值外,其他段寄存器都可⽤MOV指令进⾏初始化。
汇编常见伪指令
汇编常见伪指令汇编常见伪指令转⾃:⼀、与宏有关的伪指令在宏定义时,为了满⾜某种特殊需要,汇编语⾔还提供了⼏个伪指令。
9.3.1 局部标号伪指令LOCAL在宏定义体中,如果存在标号,则该标号要⽤伪指令LOCAL说明为局部标号,否则,当在源程序中,有多于⼀次引⽤该宏时,汇编程序在进⾏宏扩展后将会给出:标号重复定义的错误。
伪指令LOCAL的⼀般格式如下:LOCAL 标号1, 标号2, ……伪指令LOCAL必须是伪指令MACRO后的第⼀条语句,并且在MACRO和LOCAL之间也不允许有注释和分号标志。
汇编程序在每次进⾏宏扩展时,总是把由LOCAL说明的标号⽤⼀个唯⼀的符号(从??0000到??FFFF)来代替,从⽽避免标号重定义的错误。
例9.7 编写求⼀个求绝对值的宏。
解:⽅法1:ABSMACROword1CMPword1, 0JGEnextNEGword1next:ENDM假设对宏ABS有以下两次引⽤,点击它们将会显⽰汇编程序对它们进⾏宏扩展后所得到程序⽚段: ABS BX 1 CMP BX, 0 1 JGE next 1 NEG BX 1 next:… ABS AL 1 CMP AL, 0 1 JGE next 1 NEG AL 1 next:在上述程序⽚段中,显然标号next定义了⼆次,所以,汇编程序将显⽰“标号重复定义”的错误信息。
为了避免这种情况的发⽣,我们需要⽤下⾯的⽅法来定义该宏。
⽅法2:ABSMACROword1LOCALnextCMPword1, 0JGEnextNEGword1next:ENDM假设对宏ABS有以下两次引⽤,点击它们将会显⽰汇编程序对它们进⾏宏扩展时所得到程序⽚段: ABS BX 1 CMP BX, 0 1 JGE ??0000 1 NEG BX 1 ??0000:… ABS AL 1 CMP AL, 0 1 JGE ??0001 1 NEG AL 1 ??0001:在上述程序⽚段中,宏体内部的局部标号next分别⽤符号??0000和??0001来对应它的⼆次引⽤。
汇编语言的所有指令
汇编语言的所有指令数据传送指令集MOV功能: 把源操作数送给目的操作数语法: MOV 目的操作数,源操作数格式: MOV r1,r2MOV r,mMOV m,rMOV r,dataXCHG功能: 交换两个操作数的数据语法: XCHG格式: XCHG r1,r2 XCHG m,r XCHG r,mPUSH,POP功能: 把操作数压入或取出堆栈语法: PUSH 操作数POP 操作数格式: PUSH r PUSH M PUSH data POP r POP mPUSHF,POPF,PUSHA,POPA功能: 堆栈指令群格式: PUSHF POPF PUSHA POPALEA,LDS,LES功能: 取地址至寄存器语法: LEA r,m LDS r,m LES r,mXLAT(XLATB)功能: 查表指令语法: XLAT XLAT m算数运算指令ADD,ADC功能: 加法指令语法: ADD OP1,OP2 ADC OP1,OP2格式: ADD r1,r2 ADD r,m ADD m,r ADD r,data影响标志: C,P,A,Z,S,OSUB,SBB功能:减法指令语法: SUB OP1,OP2 SBB OP1,OP2格式: SUB r1,r2 SUB r,m SUB m,r SUB r,data SUB m,data影响标志: C,P,A,Z,S,OINC,DEC功能: 把OP的值加一或减一语法: INC OP DEC OP格式: INC r/m DEC r/m影响标志: P,A,Z,S,ONEG功能: 将OP的符号反相(取二进制补码)语法: NEG OP格式: NEG r/m影响标志: C,P,A,Z,S,OMUL,IMUL功能: 乘法指令语法: MUL OP IMUL OP格式: MUL r/m IMUL r/m影响标志: C,P,A,Z,S,O(仅IMUL会影响S标志)DIV,IDIV功能:除法指令语法: DIV OP IDIV OP格式: DIV r/m IDIV r/mCBW,CWD功能: 有符号数扩展指令语法: CBW CWDAAA,AAS,AAM,AAD功能: 非压BCD码运算调整指令语法: AAA AAS AAM AAD影响标志: A,C(AAA,AAS) S,Z,P(AAM,AAD)DAA,DAS功能: 压缩BCD码调整指令语法: DAA DAS影响标志: C,P,A,Z,S位运算指令集AND,OR,XOR,NOT,TEST功能: 执行BIT与BIT之间的逻辑运算语法: AND r/m,r/m/data OR r/m,r/m/data XOR r/m,r/m/data TEST r/m,r/m/data NOT r/m 影响标志: C,O,P,Z,S(其中C与O两个标志会被设为0) NOT指令不影响任何标志位SHR,SHL,SAR,SAL功能: 移位指令语法: SHR r/m,data/CL SHL r/m,data/CL SAR r/m,data/CL SAL r/m,data/CL影响标志: C,P,Z,S,OROR,ROL,RCR,RCL功能: 循环移位指令语法: ROR r/m,data/CL ROL r/m,data/CL RCR r/m,data/CL RCL r/m,data/CL 影响标志: C,P,Z,S,O程序流程控制指令集CLC,STC,CMC功能: 设定进位标志语法: CLC STC CMC标志位: CCLD,STD功能: 设定方向标志语法: CLD STD标志位: DCLI,STI功能: 设定中断标志语法: CLI STI标志位: ICMP功能: 比较OP1与OP2的值语法: CMP r/m,r/m/data标志位: C,P,A,Z,OJMP功能: 跳往指定地址执行语法: JMP 地址JXX功能: 当特定条件成立则跳往指定地址执行语法: JXX 地址注:A: ABOVE,当C=0,Z=0时成立B: BELOW,当C=1时成立C: CARRY,当弁时成立CXZ: CX寄存器的值为0(ZERO)时成立E: EQUAL,当Z=1时成立G: GREATER(大于),当Z=0且S=0时成立L: LESS(小于),当S不为零时成立N: NOT(相反条件),需和其它符号配合使用O: OVERFLOW,O=1时成立P: PARITY,P=1时成立PE: PARITY EVEN,P=1时成立PO: PARITY ODD,P=0时成立S: SIGN,S=1时成立Z: ZERO,Z=1时成立LOOP功能: 循环指令集语法: LOOP 地址LOOPE(Z)地址LOOPNE(Z) 地址标志位: 无CALL,RET功能: 子程序调用,返回指令语法: CALL 地址RET RET n标志位: 无INT,IRET功能: 中断调用及返回指令语法: INT n IRET标志位: 在执行INT时,CPU会自动将标志寄存器的值入栈,在执行IRET时则会将堆栈中的标志值弹回寄存器字符串操作指令集MOVSB,MOVSW,MOVSD功能: 字符串传送指令语法: MOVSB MOVSW MOVSD标志位: 无CMPSB,CMPSW,CMPSD功能: 字符串比较指令语法: CMPSB CMPSW CMPSD标志位: C,P,Z,S,OSCASB,SCASW功能: 字符串搜索指令语法: SCASB SCASW标志位: C,P,Z,S,OLODSB,LODSW,STOSB,STOSW功能: 字符串载入或存贮指令语法: LODSB LODSW STOSB STOSW标志位: 无REP,REPE,REPNE功能: 重复前缀指令集语法: REP 指令S REPE 指令S REPNE 指令S标志位: 依指令S而定对于IBM PC机它有它的指令系统,其中包括:数据传送指令、串处理指令、算术指令、控制移动指令、逻辑指令、处理机控制指令。
汇编语言的基本语法ppt
举例:已有数据定义如下:
TWO_BYTE DW ? 可以用以下语句对这两个字节赋予另一种
类型定义:
ONE_BYTE EQU BYTE PTR TWO_BYTE 这里ONE_BYTE与TWO_BYTE两个符号
地址具有相同得段地址与偏移地址,但就是它们 得类型属性不同,前者为1,后者为2。
此外,有时指令要求使用PTR操作符。例如 用 MOV [BX], 5
OR ((PORT_VAL GE 5) AND 30) 则当PORT_VAL < 5时,汇编结果应该就是:
MOV BX, 20 否则,汇编结果应该就是:
MOV BX, 30
(4) 数值回送操作符 数值回送操作符有:TYPE、
LENGTH、SIZE、OFFSET、SEG等。 数值回送操作符把一些特征或存储
例如,用段前缀指定某段得地址操作数 MOV AX,ES:[BX + SI]
·SHORT 用来修饰JMP指令中转向地址得属性,指
出转向地址就是在下一条指令地址得±127个 字节范围之内。
例如: JMP SHORT TAG ;转移属性为短转移 、 、 、
TAG: MOV、、、
·THIS 格式为: THIS 属性或类型 THIS可以象PTR一样建立一个指定
又例如: MOV CX, SIZE TABLE
将形成为 MOV CX, 1。
·OFFSET 格式为:OFFSET 变量或标号 汇编程序将回送变量或标号得偏移地址值。
举例: MOV BX, OFFSET OPER_ONE
汇编程序将OPER_ONE得偏移地址作为 立即数回送给指令,而在执行时则将该偏移地址 装入BX寄存器中。所以这条指令得功能与指 令
汇编语言的基本语法
第二部分 汇编语言程序设计——伪指令
例3.2:数据定义综合应用-2/2
.code .startup mov bl,bvar mov ax,word ptr dvar[0] mov dx,word ptr dvar[2] ;取双字到DX.AX mov dx,offset msg mov ah,09h CALLDOS .exit 0 end
运算符
算术运算符 + - * / MOD 逻辑运算符 AND OR XOR NOT 移位运算符 SHL SHR 关系运算符 EQ NE GT LT GE LE 高低分离符 HIGH LOW HIGHWORD LOWWORD
地址型参数
汇编语言程序中,指令参数还有地址型,
它的主要形式是标号和名字(变量名、段 名、过程名等) 硬指令的操作数有存储单元;存储单元就 应该用地址型参数(存储器操作数)表达
定义字节单元伪指令DB
DB伪指令用于分配一个或多个字节单元, 并可以将它们初始化为指定值 初值表中每个数据一定是字节量 (Byte),存放一个8位数据: 可以是0~255的无符号数 或是-128~+127带符号数 也可以是字符串常数
data X Y data
segment ;数据段 db 'a',-5 db 2 dup(100),? db 'ABC' ends
例3.4:属性及其应用-2/5
.code .startup mov al,byte ptr v_word ;用PTR改变v_word的类型,否则类型不匹配 dec al mov v_byte,al ;对v_word的头一个字节操作,原为32H、现为31H n_label: cmp flag,1 jz s_label ;flag单元为1转移 inc flag jmp n_label ;进行短转移
汇编指令符号大全
80X86 汇编指令符号大全+、-、*、/∶算术运算符。
&∶宏处理操作符。
宏扩展时不识别符号和字符串中的形式参数,如果在形式参数前面加上一个& 记号,宏汇编程序就能够用实在参数代替这个形式参数了。
$∶地址计数器的值——记录正在被汇编程序翻译的语句地址。
每个段均分配一个计数器,段内定义的所有标号和变量的偏移地址就是当前汇编地址计数器的值。
?∶操作数。
在数据定义语句中,操作数用?,其作用是分配并保留存储空间,但不存入确定的数据。
=∶等号伪指令——符号定义。
对符号进行定义和赋值,功能与EQU相似,但允许(重复)再定义。
:∶修改属性运算符(操作符)——段操作符。
用来临时给变量、标号或地址表达式指定一个段属性(不用缺省的段寄存器),自动生成一个“跨段前缀字节”。
注意,段寄存器CS和ES 不能被跨越,堆栈操作时也不能跨越SS。
;∶注释符号。
%∶特殊宏操作符,用来将其后的表达式(通常是符号常数,不能是变量名和寄存器名)转换成它所代表的数值,并将此数值的ASCII码嵌入到宏扩展中。
( )∶1.运算符——用来改变运算符的优先级别。
2.教材符号,表示括号内存储单元(或寄存器)的内容。
< >∶宏调用时用来将带间隔符(如空格,逗号等)的字符串(作为实参)括起来。
[ ]∶1.运算符。
方括号括起来的数是数组变量的下标或地址表达式。
带方括号的地址表达式必须遵循下列原则,①只有BX、BP、SI、DI这四个寄存器可在方括号内出现;②BX或BP 可单独出现在各方括号中,也可以与常数、SI或DI一起出现在方括号内,但不允许BX和BP出现在同一个方括号内;③SI和DI可以单独出现在各方括号内,也可以与常数、BP或BX一起出现在方括号内,但不允许SI和DI出现在同一个方括号内;④一个方括号内包含多个寄存器时,它们只能作加法运算;⑤若方括号内包含基址指针BP,则隐含使用堆栈段寄存器SS提供段基址,否则均隐含使用数据段寄存器DS提供段基址。
汇编编程实例
汇编编程实例.txt你妈生你的时候是不是把人给扔了把胎盘养大?别把虾米不当海鲜。
别把虾米不当海鲜。
案例1判断闰年程序data segment ;定义数据段infon db 0dh,0ah,'Please input a year: $'Y db 0dh,0ah,'This is a leap year! $'N db 0dh,0ah,'This is not a leap year! $'w dw 0buf db 8db ?db 8 dup(?)data endsstack segment stackdb 200 dup(0)stack endscode segmentassume ds:data,ss:stack,cs:codestart:mov ax,datamov ds,axlea dx,infon ;在屏幕上显示提示信息mov ah,9int 21hlea dx,buf ;从键盘输入年份字符串mov ah,10int 21hmov cl, [buf+1]lea di,buf+2call datacatecall ifyearsjc a1lea dx,nmov ah,9int 21hjmp exita1: lea dx,ymov ah,9int 21hexit: mov ah,4chint 21hdatacate proc near;push cx; dec cxlea si,buf+2tt1: inc siloop tt1;lea si,cx[di]pop cxmov dh,30hmov bl,10mov ax,1l1: push axsub byte ptr [si],dhmul byte ptr [si]add w,axpop axmul bldec siloop l1retdatacate endpifyears proc nearpush bxpush cxpush dxmov ax,wmov cx,axmov dx,0mov bx,4div bxcmp dx,0jnz lab1mov ax,cxmov bx,100div bxcmp dx,0jnz lab2mov ax,cxmov bx,400div bxcmp dx,0jz lab2lab1: clcjmp lab3lab2: stclab3: pop dxpop cxpop bxretifyears endpcode endsend start案例2产生随机数并运算的程序DATA SEGMENTCC DB '+'ww db '-'GG DB '='II DB 0DH,0AH,'$'AA DB 5 DUP(?)www dw 0ghh db '0',0dh,0ah,'$'bnm dw 0DATA ENDSSTACK SEGMENTDB 200 DUP(0)STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART: MOV AX,DATAMOV DS,AXMOV CX,20CALL RAND ;产生一随机数CALL MCAT ;将随机数转换为16进制表示的ASCII码字符 MOV AX,BXPUSH AXCMP www,0 ;WWW=0?JE A1 ;执行'+'CMP www,1 ;www=1?JE A2 ;执行'-'A1: MOV DL,CC ;显示'+'MOV AH,2INT 21HCALL RAND ;产生另一随机数add bx,0fhCALL MCAT ;将随机数转换为16进制表示的ASCII码字符 MOV DL,GG ;显示'='MOV AH,2INT 21HPOP AXADD AX,BXcmp ax,0jne yjw1lea dx,ghhmov ah,9int 21hjmp qq1yjw1: JMP B1A2: MOV DL,WW ;显示'-'MOV AH,2INT 21Hmov cx,65535mai1: loop mai1CALL RAND1CALL MCATMOV DL,GGMOV AH,2INT 21HPOP AXSbb AX,BXcmp ax,0jne yjw2lea dx,ghhmov ah,9int 21hjmp qq1yjw2: JMP B1B1: MOV BX,AXCALL MCATlea DX,IIMOV AH,9INT 21HQQ1: MOV AH,4CHINT 21HMCAT PROC ;将随机数转换为16进制表示的ASCII码字符子程序 PUSH AXpush bxPUSH CXPUSH DXCMP BX,9JA S1PUSH AXPUSH BXPUSH CXPUSH DXmov ax,bxmov bl,5div blcmp ah,3jae vb1mov www,1jmp vn1vb1:mov www,0vn1:pop dxpop cxpop bxpop axADD BL,30HMOV AA,BLMOV AA+1,'$'LEA DX,AAMOV AH,9INT 21HJMP s3s1:MOV CL,4MOV AL,0PUSH BXSHL BX,CLCMP BH,9JBE V1SUB BH,9ADD BH,40HJMP MM1V1:ADD BH,30HMM1:MOV AA,BHPOP BXAND BL,0FHPUSH AXPUSH BXPUSH CXPUSH DXmov ax,bxmov bl,5div blcmp ah,3jae vb2mov www,1jmp vn2vb2:mov www,0vn2:pop dxpop cxpop bxpop axCMP BL,9JBE TT1SUB BL,9ADD BL,40HJMP RR1TT1: ADD BL,30HRR1: MOV AA+1,BLMOV AA+2,'$'LEA DX,AAMOV AH,9INT 21Hs3:POP DXPOP CXPOP BXPOP AXRETMCAT ENDPRAND PROCPUSH CXPUSH DXPUSH AXSTIMOV AH,0 ;读时钟计数器值 INT 1AHMOV AX,DX ;清高6位AND AH,3MOV DL,101 ;除101,产生0~100余数 DIV DLMOV BL,AH ;余数存BX,作随机数POP AXPOP DXPOP CXRETRAND ENDPRAND1 PROCPUSH CXPUSH DXPUSH AXSTIMOV AH,0INT 1AHMOV ax,cxAND AH,3MOV DL,101DIV DLMOV BL,AHPOP AXPOP DXPOP CXRETRAND1 ENDPCODE ENDSEND START案例3计算平台长度程序data segmentobf db '***** welcome you !*****',0dh,0ahdb ' input data:','$'a0 db ?a1 db ?b0 db ?b1 db ?a db ?b db ?data endsstack segment stackdb 200 dup(0)stack endscode segmentassume cs:code, ds:data,ss:stack main:mov ax, datamov ds, axmov ah, 9lea dx, [obf]int 21hinc dxmov dl, 13mov ah, 2int 21hmov dl,10int 21hmov ah,1int 21hcmp al, 13jz lab1mov [a0], almov [a], almov [a1], 1x1: mov ah, 1int 21hcmp al, 13jz lab1mov [b], almov bl, [b]cmp bl, [a]jnz x2add [a1], 1jmp x1x2: mov [b0], blmov [b1], 1x3: mov ah, 1int 21hmov [a], alcmp bl,[a]jnz x4add [b1],1jmp x3x4: mov cl, [b1]cmp cl, [a1]jb y1mov cl, [b0]mov [a0], clmov cl, [b1]mov [a1],cly1: cmp al, 13jz lab1mov [b0], al mov [b1], 1mov [b], almov bl, [b]jmp x3lab1: mov ah, 2mov dl,13int 21hmov dl,10int 21hcmp [a1],10 jb z1mov ah,0mov al, [a1] mov bl, 10div bladd ax, 3030h mov bx, axmov ah, 2mov dl, blint 21hmov dl, bhint 21hjmp z2z1: add [a1], 30h mov dl, [a1]int 21hsub [a1],30hz2: mov ah,2mov dl, 13int 21hmov dl, 10int 21hmov cx, 0mov cl, [a1]mov ah, 2m: mov dl,[a0]int 21hloop mmov ah, 4chint 21hcode endsend main案例4加减乘除四则运算B_P EQU BYTE PTRW_P EQU WORD PTRD_P EQU DWORD PTR CODE SEGMENT ASSUME CS:CODE,DS:CODE ORG 100H;主程序开始NEWSTAR:JMP STAREVENNUM1 DW 0,0NUM2 DW 0,0NUM3 DW 0,0JGV4 DW 0,0YSF LABEL WORDYSF1 DB 0YSF2 DB 0JUV DB 0UV DB 0;使DS:SI指向第一有效字符OVERS LABEL NEARCLDPUSH AXOVERS1:LODSBCMP AL,' 'JZ OVERS1CMP AL,9JZ OVERS1DEC SICMP AL,13POP AXRET;输出一个制表符TAB LABEL NEARMOV AL,9JMP SHORT DISP ;输出一个回车换行符CRLF LABEL NEARMOV AL,13CALL DISP;显示一个字符DISP LABEL NEAR PUSH AXPUSH DXMOV AH,2 MOV DL,AL INT 21HPOP DXPOP AXRET;检查是否为运算符ISYSF LABEL NEAR CLDLODSBCALL ISJJ JZ ISYSF1 CALL ISII JZ ISYSF1 DEC SI ISYSF1:RET;检查是否是加减运算ISJJ LABEL NEAR CMP AL,'+' JZ ISYSF1 CMP AL,'-' RET;检查是否为乘除运算ISII LABEL NEAR CMP AL,'*' JZ ISYSF1 CMP AL,'/' JZ ISYSF1 CMP AL,'\' RET;数据输出;CX=10 十进制;CX=16 十六进制DOUT LABEL NEAR PUSH AXPUSH BXPUSH DXPUSH BPDOUT1:INC BPPUSH AXMOV AX,DXXOR DX,DXDIV CXMOV BX,AXPOP AXDIV CXPUSH DXMOV DX,BXOR BX,AXJNZ DOUT1DOUT2:POP AXADD AL,'0'CMP AL,'9'JBE DOUT3ADD AL,'A'-'9'-1 DOUT3:CALL DISPDEC BPJNZ DOUT2POP BPPOP DXPOP BXPOP AXRET;输入数据在DX:AX中返回;CX=0 数据为10进制;CX#0 数据为16进制DATE LABEL NEARPUSH BXPUSH BPPUSH DIXOR AX,AXXOR DX,DXDATE1:MOV DI,AXLODSBCMP AL,'0'JB DATE7CMP AL,'9'DATE2:AND AX,0FHSHL DI,1RCL DX,1MOV BX,DIMOV BP,DXSHL DI,1RCL DX,1SHL DI,1RCL DX,1JCXZ DATE3SHL DI,1RCL DX,1Jmp short DATE4DATE3:ADD DI,BXADC DX,BPDATE4:ADD AX,DIADC DX,0JMP DATE1DATE5:ADD AL,9JMP DATE2DATE6:JCXZ DATE7CMP AL,'A'JB DATE7CMP AL,'F'JBE DATE5CMP AL,'a'JB DATE7CMP AL,'f'JBE DATE5DATE7:MOV AX,DIDEC SIOR DI,DXPOP DIPOP BPPOP BXRET;数据1与数据2根据YSF1进行加减运算MOV AX,NUM2MOV DX,NUM2+2CMP YSF1,'+'JZ JSJJ1SUB NUM1,AXSBB NUM1+2,DXJMP SHORT JSJJ2JSJJ1:ADD NUM1,AXADC NUM1+2,DXJSJJ2:RET;数据1与数据2根据YSF1进行乘除运算JSII1 LABEL NEARMOV BX,OFFSET NUM1JMP SHORT JSII2_1;数据2与数据3根据YSF2进行乘除运算JSII2 LABEL NEARMOV BX,OFFSET NUM2JSII2_1:DB 66HMOV AX,[BX]DB 66HMOV CX,[BX+4]CMP YSF2,'*'JNZ JSII2_2DB 66HIMUL CXJMP SHORT JSII2_3JSII2_2:DB 66HCWDDB 66HIDIV CXCMP YSF2,'/'JZ JSII2_3DB 66HXCHG DX,AXJSII2_3:DB 66HMOV [BX],AXRET;显示结果MOV AX,JGV4 MOV DX,JGV4+2 MOV CX,10CMP UV,10JZ XUJG0MOV CX,16 XUJG0:TEST DX,8000H JZ XUJG1CMP UV,10JZ XUJG2CALL DOUT XUJG2:NOT AXNOT DXADD AX,1ADC DX,0PUSH AXCMP UV,10JZ XUJG3MOV AL,' 'CALL DISPMOV AL,'('CALL DISP XUJG3:MOV AL,'-'CALL DISPPOP AXCMP UV,10JZ XUJG1CALL DOUTMOV AL,')'CALL DISPRETXUJG1:CALL DOUTRET;计算结果放入DX:AX中JSJG LABEL NEARCALL JSJJMOV AX,NUM1 MOV DX,NUM1+2 RET;从DS:SI处取一个数据LOADATE LABEL NEARLODSBCMP AL,'('JZ LOADATE1DEC SIPUSH CXXOR CX,CXCMP UV,10JZ LOADATE0INC CX ;取16进制数LOADATE0:CALL DATE ;取数据放入DX:AX中POP CXRETLOADATE1:PUSH NUM1 ;保存数据1数据2及运算符 PUSH NUM1+2PUSH NUM2PUSH NUM2+2PUSH YSFINC JUVMOV JGV4,0 ;结果值清零MOV JGV4+2,0;进行四则运算SZYS LABEL NEARCALL ISYSF ;首字符是运算符?JZ SZYS2CALL LOADATE ;不是,取数并保存MOV NUM1,AXMOV NUM1+2,DXSZYS1:XOR AX,AX ;数据2清零MOV NUM2,AXMOV NUM2+2,AXCALL ISYSF ;下个是运算符?JZ SZYS3JNZ SZYS6SZYS2:PUSH AXMOV AX,JGV4 ;将结果作为数据1MOV NUM1,AXMOV AX,JGV4+2MOV NUM1+2,AXPOP AXSZYS3:MOV YSF1,ALMOV YSF2,ALCALL ISJJ ;是加减运算转JZ SZYS4CALL LOADATE ;取数据2MOV NUM2,AXMOV NUM2+2,DXCALL JSII1 ;数据1与数据2根据YSF1进行乘除运算 JMP SZYS1 ; 结果保存在数据1中SZYS4:CALL LOADATE ;取数据2并保存MOV NUM2,AXMOV NUM2+2,DXSZYS4_1:CALL ISYSFJNZ SZYS6CALL ISJJ ;运算符2是加减运算?JNZ SZYS5 ;不是转PUSH AXCALL JSJJ ;数据1与数据2根据YSF1进行加减运算 POP AX ; 结果保存在数据1中MOV YSF1,AL ;保存新的运算符JMP SZYS4SZYS5:MOV YSF2,AL ;保存运算符2CALL LOADATE ;取数据3MOV NUM3,AXMOV NUM3+2,DXCALL JSII2 ;数据2与数据3根据YSF2进行乘除运算 JMP SZYS4_1 ; 结果保存在数据2中SZYS6:MOV CL,ALCMP AL,13JNZ SZYS9SZYS7:CALL JSJGCMP JUV,0JZ SZYS8DEC JUVPOP YSFPOP NUM2+2POP NUM2POP NUM1RETSZYS8:CMP CL,')'JZ SZYS10MOV JGV4,AX MOV JGV4+2,DX JNZ SZYS12 SZYS9:CMP AL,')'JNZ SZYS11INC SIJMP SZYS7 SZYS10:MOV NUM1,AX MOV NUM1+2,DX JMP SZYS1 SZYS11:STCRETSZYS12:CLCRET;数制处理UVIL LABEL NEARPUSH SIUVIL1:LODSBCMP AL,' 'JZ UVIL2CMP AL,9JZ UVIL2CMP AL,13JZ UVIL4JNZ UVIL1 UVIL2:MOV BX,SICALL OVERSJZ UVIL3LODSWCALL OVERSPOP SIJNZ SZYS11JNZ SZYS11PUSH SIMOV UV,10UVIL3:MOV AL,13MOV [BX-1],AL UVIL4:POP SICLCRET;预置结果YVJG LABEL NEARMOV AH,52HINT 21HMOV AX,ES:[BX-2] MOV DS,AXMOV AX,DS:[0CH] MOV CS:JGV4,AX MOV AX,DS:[0EH] MOV CS:JGV4+2,AX PUSH CSPOP DSPUSH CSPOP ESRET;保存结果BCJG LABEL NEARMOV AH,52HINT 21HMOV AX,ES:[BX-2] MOV DS,AXMOV AX,CS:JGV4 MOV DS:[0CH],AX MOV AX,CS:JGV4+2 MOV DS:[0EH],AX PUSH CSPOP DSPUSH CSPOP ESRETSTAR:MOV SI,81HCLDJNZ STAR1STAR0:MOV DX,OFFSET MESS1JMP STAR4STAR1:CALL YVJGCALL UVILJB STAR0MOV SAVESP,SPCALL SZYSMOV SP,SAVESPMOV DX,OFFSET MESS2JB STAR4CALL CRLFCALL XUJGCALL BCJGMOV DX,OFFSET MESS3STAR4:MOV AH,9INT 21HINT 20HSAVESP DW 0MESS1 DB 13,10,' Syntax:',13,10DB ' JS <Expression> [10]',13,10,'$'MESS2 DB 'Error in expression !$'MESS3 DB 13,10,'$'CODE ENDSEND NEWSTAR案例5数字方阵程序data segmentbuf1 db '1 2 38 9 47 6 5'buf2 db '1 2 3 412 13 14 511 16 15 610 9 8 7'buf3 db '1 2 3 4 516 17 18 19 615 24 25 20 714 23 22 21 813 12 11 10 9' dbuf db 14 dup(?)i1 db 0dh,0ah,'this is a fangzhen programme'db 0dh,0ah,'input q to exit'db 0dh,0ah,'Please input a number(3--5):','$'i2 db 0dh,0ah,'input error,please reinput!','$'n db ?b db 1data endsstack segmentdb 100 dup(?)stack endscode segmentassume ds:data,cs:code,ss:stack main:mov ax,datamov ds,axcall clearlop: lea dx,i1mov ah,9int 21hmov ah,1int 21hcmp al,'q'jz quitlea si,buf1mov n,7mov cl,3call clearcmp al,'3'jz slea si,buf2mov n,10mov cl,4cmp al,'4'jz slea si,buf3mov cl,5mov n,13cmp al,'5'jz slea dx,i2mov ah,9int 21hcall clearjmp lops:mov bl,nlea di,dbufl: mov al,[si]mov [di],alinc siinc didec bljne lmov [di],byte ptr '$' mov ah,2mov dh,bmov dl,0int 10hlea dx,dbufmov ah,9int 21hinc bloop sjmp lopquit: mov ah,4chint 21h;***清屏***clear proc nearpush axpush bxpush cxpush dxmov ah,6mov al,0mov ch,0mov cl,0mov dh,24mov dl,79mov bh,7int 10hpop dxpop cxpop bxpop axretclear endpcode endsend main案例6数据加密程序p macro buflea dx,bufmov ah,9int 21hendmdata segmentpp db 0dh,0ah,' welcome you to run this programme!$' qq db 0dh,0ah,' when you input number,press enter.$' qw db 0dh,0ah,'6eh,52h,94h,52h,$'qa db 0dh,0ah,' $'info1 db 0dh,0ah,0dh,' input number:$'info2 db 0dh,0ah,' output number:$'bufa db 20db ?db 20 dup(0)bufb db 20 dup(0)buf1 db 20db ?db 20 dup(0)buf2 db 20 dup(0)buf3 db 20db ?db 20 dup(0)buf4 db 20 dup(0)data endsstack segmentdb 100 dup(0)stack endscode segmentassume ds:data,cs:codes: mov ax,datamov ds,axmov ah,0mov al,3int 10hmov ah,0bhmov bh,0mov bl,3int 10hp ppp qqlea si,qwmov di,5mov dx,0405hmov ah,15int 10hlp: mov ah,2inc dlint 10hmov bl,[si]mov cx,1mov ah,9int 10hinc sijnz lpp qap qap qap info1lea dx,bufamov ah,10int 21hlea si,bufa+1mov ch,0mov cl,[si]lea di,bufbn: mov bx,offset bufamov al,0xlat bufamov [di],alinc diloop nmov byte ptr [di],'$' p info2p bufbp info1lea dx,buf1mov ah,10int 21hlea si,buf1+1mov ch,0mov cl,[si]lea di,buf2n1: mov bx,offset buf1 mov al,2xlat buf1mov [di],alinc diloop n1mov byte ptr [di],'$' p info2p buf2p info1lea dx,buf3mov ah,10int 21hlea si,buf3+1mov ch,0mov cl,[si]lea di,buf4n2: mov bx,offset buf3mov al,3xlat buf3mov [di],alinc diloop n2mov byte ptr [di],'$'p info2p buf4mov ah,4chint 21hcode endsend s案例7代码转换程序(1)public info1,info2,bufa,bufb,buf,main,info0,info3extrn change1:far,change2:far,change3:far,change4:fardata segmentinfo0 db 0ah,0dh,'this is the change of letter to leter:$'info1 db 0ah,0dh,'please input string:$'info2 db 0ah,0dh,'output string:$'bufa db 81db ?db 80 dup (?)bufb db 80 dup (?)info3 db 0ah,0dh,'this is the change of digital to digital:',0ah,0dh,'$'buf db 0dh,0ah,'the number is:0100101010001111b',0ah,0dh,'the result is:$' data endsstack segment stackdb 200 dup (?)stack endscode segmentmain proc farassume ds:data,cs:code,ss:stackmov ax,datamov ds,axdisp macro mlea dx,mmov ah,9int 21hendmcall change1call change2disp info3disp bufcall change3call change4retmain endpcode endsend(2)extrn info1:byte,info2:byte,bufa:byte,bufb:byte,info0:byte public change1code segmentassume cs:codelowtohigh proc nearcmp al,'a'jb stopcmp al,'z'ja stopsub al,20hstop :retlowtohigh endpchange1 proc farlea dx,info0mov ah,9int 21hlea dx,info1mov ah,9int 21hlea dx,bufamov ah,10int 21hlea si,bufa+1lea di,bufbmov ch,0mov cl,[si]add si,1next:mov al,[si]call lowtohighmov [di],alinc siinc diloop nextmov byte ptr [di],'$'lea dx,info2mov ah,9int 21hlea dx,bufbmov ah,9int 21hretchange1 endpcode endsend(3)extrn info1:byte,info2:byte,bufa:byte,bufb:byte public change2code segmentassume cs:codehightolow proc nearcmp al,'A'jb stopcmp al,'Z'ja stopadd al,20hstop:rethightolow endpchange2 proc farlea dx,info1mov ah,9int 21hlea dx,bufamov ah,10int 21hlea si,bufa+1lea di,bufbmov ch,0mov cl,[si]inc sinext:mov al,[si]call hightolowmov [di],alinc siinc diloop nextmov byte ptr [di] ,'$' lea dx,info2mov ah,9int 21hlea dx,bufbmov ah,9int 21hretchange2 endpcode endsend(4)extrn buf:byte,info3:byte public change3code segmentchange3 proc farassume cs:codesub ax,axmov ch,4mov cl,4mov bx,4a8fhrotate: rol bx,clmov al,bland al,0fhadd al,30hcmp al,3ahjl printitadd al,7hprintit: mov dl,almov ah,2int 21hdec chmov dl,'H'mov ah,2int 21hretchange3 endpcode endsend(5)public change4data segmentbuf db 0ah,0dh,'please input the four hexnumber:$' data endscode segmentassume cs:code,ds:datachange4 proc farmov ax,datamov ds,axlea dx,bufmov ah,9int 21hmov bx,0mov ch,4input: mov cl,4sal bx,clmov ah,1int 21hcmp al,39hja afand al,0fhjmp binaryaf: and al,0fhadd al,9binary: or bl,aldec chcmp ch,0jne inputmov dl,'H'mov ah,2int 21hmov dl,0ahmov ah,2int 21hmov ah,02int 21hmov cx,16disp: mov dl,0rol bx,1rcl dl,1or dl,30hmov ah,02hint 21hloop dispmov dl,'B'mov ah,2int 21hretchange4 endpcode endsend(6)public change5data segmentbinary dw 7fffh,50hn=($-binary)/2buf db 7 dup(0)info1 db 0ah,0dh,'this is the change from hexnumber to decimal:$' info2 db 0ah,0dh,'the number is:7fffh,50h$',0ah,0dhinfo3 db 0ah,0dh,'the result is:$'data endsstack segment stackdb 200 dup(0)stack endscode segmentassume cs:code,ds:data,ss:stackf2to10 proc nearpush bxpush dxpush sipush cxdisp macro mlea dx,mmov ah,9int 21hendmlea si,bufor ax,axjns plusneg axmov [si],byte ptr '-' inc siplus: mov bx,10mov cx,0lop1: mov dx,0div bxpush dxinc cxor ax,axjne lop1lop2: pop axcmp al,10jb l1add al,7l1: add al,30hmov [si],alinc sidec cxjne lop2mov [si],byte ptr 'D' inc simov [si],byte ptr '$' disp info3disp bufpop cxpop sipop dxpop bxretf2to10 endpchange5 proc farstart: mov ax,datamov ds,axdisp info1disp info2mov cx,nlea di,binarylopa: mov ax,[di]call f2to10add di,2loop loparetchange5 endpcode endsend案例8键盘录入数据的转换与显示(1)PUBLIC ASC_TO_BIN , BIN_TO_ASCIIDATA SEGMENT COMMONINPUT_MESSAGE DB 0AH , 'PLEASE INPUT A NUMBER(LESS THAN 5 FIGURES):$'IN_ASC_BUF DB 6 ;十进制数的输入缓冲区,共可接收6个字符DB ? ;保留,用于10号调用时DOS填入实际输入字符个数DB 6 DUP(?) ;一个符号位,四位数字ASCII 码,加上一个回车符,;共计6字符BIN_BUF1 DW ? ;将第一个数转换为二进制后,放于此处OUTPUT_MESSAGE DB 0AH , 'THE SUM IS:' , '$'OUT_ASC_SUM DB 6 DUP(?) , '$' ;将二个数的和转换为ASCII码后,放于此处,;以供9号调用显示DATA ENDSCSEG SEGMENTASSUME CS:CSEG , DS:DATAASC_TO_BIN PROC FAR;ASCII码转换为二进制数;入口:十进制数的ASCII码在IN_ASC_BUF内;出口:转换后的二进制数在AX内;算法:先将其转换成十进制数字,再用累加和乘10加X的方法变成二进制数,如将;358转换为二进制数,可先将累加和赋0,再计算(((0*10+3)*10+5)*10+8),结果为二;进制数,再由符号位决定是否需要求补。
汇编助记符
MOV(MOVe)传送指令PUSH 入栈指令POP 出栈指令XCHG(eXCHanG)交换指令XLAT(TRANSLATE)换码指令LEA (Load Effective Address)有效地址送寄存器指令LDS(Load DS with pointer)指针送寄存器和DS指令LES(Load ES with pointer)指针送寄存器和ES指令LAHF(Load AH with Flags)标志位送AH指令SAHF(Store AH into Flgs) AH送标志寄存器指令PUSHF(PUSH the Flags)标志进栈指令POPF(POP the Flags)标志出栈指令ADD 加法指令ADC 带进位加法指令INC 加1指令SUB(SUBtract)不带借位的减法指令SBB(SuVtrach with borrow)带借位的减法指令DEC(DECrement)减1指领NEG(NEGate)求补指令CMP(CoMPare)比较指令MUL(unsinged MULtiple)无符号数乘法指令IMUL(sIgned MUL tiple)有符号数乘法指令DIV(unsigned DIVide)无符号数除法指令IDIV(sIgned DIVide)有符号数除法指令CBW(Count Byte to Word)字节转换为字指令CWD(Count Word to Doble word)字转换为双字指令DAA 压缩的BCD码加法十进制调整指令DAS 压缩的BCD码减法十进制调整指令AAA 非压缩的BCD码加法十进制调整指令AAS 非压缩的BCD码加法十进制调整指令AND 逻辑与指令OR 逻辑或指令XOR 逻辑异或指令NOT 逻辑非指令TEST 测试指令SHL(SHift logical Letf)逻辑左移指令SHR(SHift logical Right)逻辑右移指令ROL(Rotate Left )循环左移指令P58ROR(Rotate Right)循环右移指令P58RCL(Rotate Left through Carry)带进位循环左移RCR(Rotate Right through Carry)带进位循环左移MOVS(MOVe String)串传送指令STOS(STOre into String)存入串指令LODS(LOad from string)从串取指令REP(REPeat)重复操作前CLD(CLear Direction flag)清除方向标志指令STD(SeT Direction flag)设置方向标志指令CMPS(CoMPare String)串比较指令SCAS(SCAn String)串扫描指令REPE/REPZ(REPeat while Equal/Zero)相等/为零时重复操作前缀答案补充REPNE/REPNZ(REPeat while Not Equal/Zero)不相等/不为零进重复前缀IN(INput)输入指令OUT(OUTput)输出指令JMP(JuMP)无条件转移指令JZ,JNZ,JS,JNS,JO,JNO,JP,JNP,JB,JNB,JBE,JNBE,JL,JNL,JLE,JNLE,JCXZ 条件转移指令LOOP 循环指令P70LOOPZ/LOOPE 为零/相等时循环指令LOOPNZ/LOOPNE 不为零/不相等时循环指令CALL 子程序调用指令RET(RETun)子程序返回指令CLC(CLear Carry)进位位置0指令CMC(CoMplement Carry)进位位求反指令SRC(SeT Carry)进位位置1指令NOP(No OPeretion)无操作指令答案补充HLT(HaLT)停机指令OFFSET 返回偏移地址SEG 返回段地址EQU(=) 等值语句PURGE 解除语句DUP 操作数字段用复制操作符SEGMENT,ENDS 段定义指令ASSUME 段地址分配指令ORG 起始偏移地址设置指令$ 地址计数器的当前值PROC,ENDP 过程定义语句NAME,TITLE,END 程序开始结束语句MACRO,ENDM 宏定义指令JZ OPR //结果为零转移JNZ OPR //结果不为零转移JS OPR //结果为负转移JNS OPR //结果为正转移JO OPR //溢出转移JNO OPR //不溢出转移JP OPR //结果为偶转移JNP OPR //结果为奇转移JC OPR //有进位转移JNC OPR //无进位转移NV: 未溢出0 OV: 溢出1 ------------------------------OF UP: 方向为上0(di,si += 1) DN:方向为下1(di,si -= 1)---- DI: 关中断0 EI: 开中断1--------PL: 正0 NG: 负1-------------SFNZ: 非0 0 ZR: 0 1----------------ZFNA: 无辅助进位0 AC: 辅助进位1-------AFPO: 奇数0 PE: 偶数1 ------------PFNC: 无进位0 CY: 进位1 ----------Cf。
汇编语言模拟题答案-(3)
第3章自测练习一、选择题(四选一)1.表示一条处理器指令所在存储单元的符号地址是 C。
A变量 B常量 C标号 D偏移量2.汇编语言中的变量有多种类型属性,但错误的类型是B 。
A字节型byte B字符型charC字型word D双字型dword3.执行mov bx,seg var指令,BX得到变量var的B 。
A物理地址 B段地址 C偏移地址 D内容4.MASM语句中,采用C 分隔标号和指令。
A逗号 B分号 C冒号 D空格5.欲设定从偏移地址100H开始安排程序,可使用A 伪指令。
Aorg 100h Bstart=100hCstart db 100h Dstart equ 100h6.与“mov bx,offset var”指令等效的指令是 D 。
A movbx,varB 1dsbx,varCles bx,var D1ea bx,var.7.下条语句buf db l0 dup(3 dup(?,10),3,10)汇编后,变量buf占有的存储单元字节数是B 。
A 100B 80C 40D 208.数据定义语句“numl dw(12 or 6 and 2) ge 0eh”,定义的num1单元的内容是 B。
A 0B 0FFFFHC 1D 0FFH9.要求将A、B两个字符的ASCII码41H和42H顺序存放在连续两个字节存储单元中,可选用的语句是 A 。
A db`AB'B dw `AB'C db 0ABHD dw 0ABH10.在汇编语言程序中,对END语句叙述正确的是C 。
AEND语句是一可执行语句BEND语句表示程序执行到此结束CEND语句表示源程序到此结束DEND语句在汇编后要产生机器码11.下面的数据传送指令中,错误的操作是D。
Amov ss:[bx+di],byte ptr 10h Bmov dx,l000hCmov word ptr[bx],1000h Dmov ds,2000h12.下面指令执行后,变量dab中的内容是C 。
汇编语言程序格式
2. 段使用设定语句 汇编程序根据段开始语句和段结束语句判断出源程序的段划分,
为了有效地产生目标代码,汇编程序还要了解各程序段与段寄 存器间的对应关系。这种对应关系由段使用设定语句说明。
ASSUME 段寄存器名:段名[,段寄存器名:段名……] 段寄存器名可以是CS,DS,SS和ES。 段名就是段开始和段结束语句中规定的段名。
例如:CS寄存器对应CSEG段,DS寄存器对应DSEG段。
ASSUME CS : CSEG , DS : DSEG ASSUME伪指令中段名也可以是一个特别的关键字NOTHING,
它表示某个段寄存器不与任何段有对应关系。
DSEG1 SEGMENT VARW DW 12
DSEG1 ENDS DSEG2 SEGMENT
2. 重复操作符DUP 有时需要定义数组,有时还需要定于数据缓冲区。 例如: BUFFER DB 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 以上操作太不方便,为此,汇编语言停供了在数据定义语句中 使用的重复操作符DUP。 比如,上述定义语句与如下定义语句起相同的作用: BUFFER DB 8 DUP(0) 重复操作符DUP的一般格式如下: count DUP (表达式[, 表达式, ……]) 例如: BUFFER1 DB 5 , 0 , 5 DUP(?)
6. 优先级 汇编语言中各种运算符和操作符的优先级按高到低排列如下: (1)圆括号,尖括号,方括号,圆点符,LENGTH,SIZE, WIDTH , MASK。 (2)PTR, OFFSET,SEG,TYPE, THIS,冒号。 (3)* , / , MOD, SHL, SHR (4)HIGH, LOW (5)+ , (6)EQ,NE,LT,LE,GT,GE (7)NOT (8)AND (9)OR , XOR (10)SHORT
汇编程序出错提示
汇编程序出错信息编码说明0 Block nesting error嵌套过程、段、结构、宏指令等不是正确结束。
1 Extra character on line当一行上已接受了定义指令的足够信息,而又出现了多余的字符。
2 Register already defined汇编内部出现逻辑错误。
3 Unknown symbol type在符号语句的类型字段中,有些不能识别的东西。
4 Redefinition of symbol在第二遍扫视时,接着又定义一个符号。
5 Symbol is multi-defined重复定义一个符号。
6 Phase error between passes程序中有模棱两可的指令,以至于在汇编程序的两次扫视中,程序标号的位置在数值上改变了。
7 Already had ELSE clause在ELSE从句子试图再定义ELSE从句。
8 Not in conditional block在没有提供条件汇编指令的情况下,指定了ENDIF或ELSE。
9 Symbol not defined符号没有定义。
10 Syntax error语句的语法与任何可识别的语法不匹配。
11 Type illegal in context指定的类型在长度上不可接收。
12 Should have been group name给出的组合不符合要求。
13 Must be declared in pass 1得到的不是汇编程序所要求的常数值。
例如,向前引用的向量长度。
14 Symbol type usage illegalPUBLIC符号的使用不合法。
15 Symbol already different kind企图定义与以前定义不同的符号。
16 Symbol is reserved word企图非法使用一个汇编程序的保留定(例如,宣布MOV为一个变量)。
17 Forward reference is illegal向前引用必须是在第一遍扫视中定义过的。
汇编指令大全
AND 与运算. OR 或运算. XOR 异或运算. NOT 取反.
TEST 测试.(两操作数作与运算,仅修改标志位,不回送结果).
SHL 逻辑左移.
SAL 算术左移.(=SHL) SHR 逻辑右移.
SAR 算术右移.(=SHR) ROL 循环左移.
REPNC 当 CF=0 且 CX/ECX<>0 时重复.
五、程序转移指令
───────────────────────────────────────
1>无条件转移指令 (长转移) JMP 无条件转移指令
CALL 过程调用
RET/RETF 过程返回.
2>条件转移指令 (短转移,-128 到+127 的距离内) ( 当且仅当(SF XOR OF)=1 时,OP1
5>处理器控制指令
HLT 处理器暂停, 直到出现中断或复位信号才继续.
WAIT 当芯片引线 TEST 为高电平时使 CPU 进入等待状态. ESC 转换到外处理器.
LOCK 封锁总线. NOP 空操作.
STC 置进位标志位. CLC 清进位标志位. CMC 进位标志取反. STD 置方向标志位. CLD 清方向标志位.
CBW 字节转换为字. (把 AL 中字节的符号扩展到 AH 中去) CWD 字转换为双字. (把 AX 中的字的符号扩展到 DX 中去) CWDE 字转换为双字. (把 AX 中的字符号扩展到 EAX 中去) CDQ 双字扩展. (把 EAX 中的字的符号扩展到 EDX 中去)
三、逻辑运算指令
END 程序结束
汇编语言的数据和表达式
例: MOV AX,0FFH MOV BX,20 .RADIX 16 MOV CX,0FF MOV DX,20D
注意:B_VAR1和W_VAR2都是给变量增加类型属性,并不另外占用存储单元 (2)与标号连用 用来给相连的指令地址(即标号)定义一个新的标号,并指定新的距离属性。 例: DISTFAR LABEL FAR
DISTNEAR: MOV EAX,EBX 给近标号DISTNEAR取一个新的标号名DISTFAR,距离属性修改为FAR。当其它代码
;(AL)=00001011B
MOV AL,11100001B OR 10000101B
;(AL)=11100101B
MOV AL,10111011B XOR 00100100B
;(AL)=10011111B
14
三、关系运算符
包括EQ、NE、LT、GT、LE、GE共六种; 可对常量或同一段内的存储器地址进行比较运算; 若条件满足,运算结果为真,输出结果为全“1”; 若不满足条件,运算结果为假,输出结果为全“0”。 例: MOV BX,10 EQ 1010B
COUNT EQU ECX
;为ECX重新取名
注意:该等值语句只作为符号定义用,不产生任何目标代码,也不占用存储单元,并 且不能是程序中曾经定义过的符号名。
3
(2) “=”伪指令
“=”伪操作命令与EQU具有相同的功能,但它定义 的符号允许重新定义。
例:PERSON=10 ;定义PERSON等于10 PERSON=PERSON+5 ;重新定义PERSON等于15
汇编语言
汇编语言程序设计 串处理指令—串传送指令
常见问题分析
MOVS常与 常与REP一起使用,使用该指令前,应该先做好以 一起使用, 常与 一起使用 使用该指令前, 下准备工作: 下准备工作: 把存放于数据段中的源串首地址(如反向传送则应是末地址 如反向传送则应是末地址) ①把存放于数据段中的源串首地址 如反向传送则应是末地址 放入SI/ESI寄存器中; 寄存器中; 放入 寄存器中 把将要存放数据串的附加段中的目的串首地址(或反向传送时 ②把将要存放数据串的附加段中的目的串首地址 或反向传送时 放入DI/EDI寄存器中 寄存器中; 的末地址)放入 的末地址)放入DI/EDI寄存器中; 把数据串长度放入计数寄存器( ③把数据串长度放入计数寄存器(COUNT REG); ); 建立方向标志。 ④建立方向标志。 方向标志设置指令: ◆ ◆ ◆ 方向标志设置指令: CLD(Clear direction flag)使DF=0,在执行串处理指令 ( ) , 时可使地址自动增量 自动增量。 时可使地址自动增量。 STD(Set direction flag) 使DF=1,在执行串处理指令时 ( ) , 自动减量。 可使地址自动减量。 可使地址自动减量
汇编语言程序设计 分析下列程序段执行结果。 例: 分析下列程序段执行结果。 ARRAY TEMP
常见问题分析
数据传送指令---地址传送指令 数据传送指令---地址传送指令 --DW 123H,98H,ABH,32DH,200H , , , , 23 ARRAY DW 5 01 ┇ LEA SI,ARRAY , 98 ADD SI,TEMP SI, 00 MOV AX,[SI] ,
汇编语言程序设计
常见Байду номын сангаас题分析
指令合法性判断
反汇编语言常用指令
内容目录计算机寄存器分类简介计算机寄存器常用指令一、常用指令二、算术运算指令三、逻辑运算指令四、串指令五、程序跳转指令------------------------------------------计算机寄存器分类简介:32位CPU所含有的寄存器有:4个数据寄存器(EAX、EBX、ECX和EDX)2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP) 6个段寄存器(ES、CS、SS、DS、FS和GS)1个指令指针寄存器(EIP) 1个标志寄存器(EFlags)1、数据寄存器数据寄存器主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器的时间。
32位CPU有4个32位的通用寄存器EAX、EBX、ECX和EDX。
对低16位数据的存取,不会影响高16位的数据。
这些低16位寄存器分别命名为:AX、BX、CX和DX,它和先前的CPU中的寄存器相一致。
.4个16位寄存器又可分割成8个独立的8位寄存器(AX:AH-AL、BX:BH-BL、CX:CH-CL、DX:DH-DL),每个寄存器都有自己的名称,可独立存取。
程序员可利用数据寄存器的这种“可分可合”的特性,灵活地处理字/字节的信息。
寄存器EAX通常称为累加器(Accumulator),用累加器进行的操作可能需要更少时间。
可用于乘、除、输入/输出等操作,使用频率很高;寄存器EBX称为基地址寄存器(Base Register)。
它可作为存储器指针来使用;寄存器ECX称为计数寄存器(Count Register)。
在循环和字符串操作时,要用它来控制循环次数;在位操作中,当移多位时,要用CL来指明移位的位数;寄存器EDX称为数据寄存器(Data Register)。
在进行乘、除运算时,它可作为默认的操作数参与运算,也可用于存放I/O的端口地址。
在16位CPU中,AX、BX、CX和DX不能作为基址和变址寄存器来存放存储单元的地址,在32位CPU中,其32位寄存器EAX、EBX、ECX和EDX不仅可传送数据、暂存数据保存算术逻辑运算结果,而且也可作为指针寄存器,所以,这些32位寄存器更具有通用性。
汇编语言 基本指令
①输入指令
将外设数据传送给 将外设数据传送给CPU内的 内的AL/AX 内的
IN 指令 一般格式 IN AL,n ; , IN AX,n ; , IN AL,DX ; , IN AX,DX ; , I/O端口输入数据至 端口输入数据至AL或AX. 功 能 从I/O端口输入数据至AL或AX. 输入指令允许把一个字节或一个字由一个输入端口传 送到AL或 中 若端口地址超过255时,则必须用 送到 或AX中.若端口地址超过 时 则必须用DX 保存端口地址,这样用DX作端口寻址最多可寻找 作端口寻址最多可寻找64K 保存端口地址,这样用 作端口寻址最多可寻找 个端口. 个端口.
常用伪指令(补充) 四 常用伪指令(补充)
data segment BUF1 dw 15H,20H,30H,50H,80H BUF2 dw 10 DUP(?) data ends DB和DW也可以定义一组内存空间 相当于一个数组, DB和DW也可以定义一组内存空间,相当于一个数组, 也可以定义一组内存空间, 变量名指向第一个元素的地址. 变量名指向第一个元素的地址. 如 MOV AX,BUF1 MOV BX,BUF1+4 执行后 (AX)=15H,(BX)=30H 因为是字类型所以每后一个元 素+2. .
显示字符串( 号调用 号调用) ⑸显示字符串(9号调用) LEA DX,待显示字符串首偏移地址 , MOV AH,9 , INT 21H; 将当前数据区中以 ' $ ' ; 将当前数据区中以' 结尾的字符串显示 字符串输入( (号调用 ⑹字符串输入SP 10号调用) ( 号调用) SP)- )-2 )- LEA DX,缓冲区首偏移地址 , MOV AH,10 , INT 21H ;从键盘上输入一字符串 到用户定义的输入缓冲区中,并显示. 到用户定义的输入缓冲区中,并显示.
MASM汇编语言基础
§4.4 程序的段构造
§4.4.1 段定义伪指令 格式: 段名 SEGMENT
…… 段名 ENDS 一个完整的汇编源程序中可以定义多个段,但同时起作用的最多只 有4个。每一个段都是由伪指令SEGMENT开场,由ENDS完毕, SEGMENT和ENDS必须成对出现,并且在SEGMENT和ENDS的前面都 必须有同一个段名;SEGMENT和ENDS语句之间的省略号局部,对于代 码段来说,主要是指令,也可以有伪指令;对于数据段、附加段和堆栈 段来说,一般是存储单元的定义、分配等伪操作。
用它的ASCII码值存储在内存中。
§4.2.2 变量
变量就是用来表示程序中所用的内存操作数。
1.定义
格式:[变量名] 类型助记符 操作数[,操作数,……]
其中变量名字段是可有可无的,它用于指示内存 操作数的地址〔符号地址〕;操作数字段用于指示内 存操作数,汇编程序将定义的内存操作数,按其类型 常用的给有它以们下几分种配:内存单元。
〔4〕带DUP表达式:DUP是定义重复数据操作符,在操作数 局部的格式为:
重复次数 DUP〔重复的内容〕
DUP可以嵌套使用
jin
举例:jia DB 2 DUP (3,0FH,‘a’)
jin DB 3 DUP (2 DUP (?),0E5H),8
jia
其中jia,jin是变量名
4.变量的使用
〔1〕在指令语句中,如果要对某存储单元进展存 取操作,就可直接引用它的变量名;假设操作数采 用直接寻址,变量的偏移量作为操作数偏移量;而 操作数假设采用了存放器相对寻址或相对基址变址 寻址,此时变量的偏移量就作为操作数的位移量。
§4.5 其它常用伪指令
§4.5.1 符号定义语句 1.等值语句 就是赋值语句 格式:符号 EQU 表达式