微机原理 sigef sig值是什么意思思

暂无话题描述关注话题分享阅读全文9.1K392 条评论分享收藏感谢阅读全文8K565 条评论分享收藏感谢
阅读全文7.3K450 条评论分享收藏感谢阅读全文6.7K693 条评论分享收藏感谢阅读全文6.5K204 条评论分享收藏感谢23,517豆丁微信公众号
君,已阅读到文档的结尾了呢~~
STC15F2K60S2系列单片机
SPI接口课件
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
STC15F2K60S2系列单片机
SPI接口课件
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='http://www.docin.com/DocinViewer--144.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口当前位置: >>
微机原理与接口技术 第4章 汇编语言程序设计1
第4章 汇编语言程序设计4.1 汇编语言的格式 4.1.1 8086汇编语言程序的一个例子MY_DATA SUM 一个字节 MY_DATA MY_CODE SEGMENT ;定义数据段 DB ? ;为符号SUM保留 ENDS ;定义数据段结束 SEGMENT ;定义码段 ASSUME CS:MY_CODE, ;规定CS和DS 的内容 DS:MY_DATA PORT_VA1 EQU 3 ;端口的符号名 GO: MOV AX, MY_DATA ;DS 初始化为MY_DATA MOV DS, AX MOV SUM, 0 ;清SUM单元 CYCLE: CMP SUM, 100 ;SUM单 元与100相比较 JNA NOT_DONE ;若未超过, 转至NOT_DONE MOV AL, SUM ;若超过, 把SUM单元的内容 OUT PORT_VAL, AL ;通过 AL输出 HLT ;然后停机 NOT DONE:IN AL, PORT_VAL 未超过时,输入下一个字节 ADD SUM, AL 与以前的结果累加 JMP CYCLE 转至CYCLE;; ; MY CODEENDS ;代码段结束 END GO ;整个程序结束 由这个例子看到,8086汇编的一个语 句行是由4个部分组成的,即操作码 操作数 ;注释(或名字)标号 4.1.2 8086汇编语言源程序的格式源程序的一般格式为:NAME1 SEGMENT 语句 语句 NAME1 ENDS NAME2 SEGMENT 语句 语句 NAME2 ENDS END &标号& 4.2 语句行的构成 4.2.1 标记(Token)1.IBM宏汇编的字符集 (1)字母 包含大写的英文字母:ABCD…XYZ; 小写的英文字母:abc…xyz。 (2)数字 阿拉伯数字:。 (3)特殊字符+ ; C . * / = ( : ) ? [ ] @ < > $ &′ ’ , ―图4-1IBM宏汇编字符集中可打印字符 2.界符(Delimiters),; (< ― ? ) ?图4-2/ + *; &> + = /[]IBM宏汇编中的界符集 3.常量(Constants)(1)数字(整数)常量① 二进制常量 以字母B结尾的由一串“0”和“1”组成 的序列。例如,B。 ② 十进制常量由若干个0~9的数字组成的序列,可 以以字母D作结尾,或没有任何字母作结尾。 例如,1234D或1234。 ③ 八进制常量以字母Q结尾,由若干个0~7的数字组 成的序列。例如255Q、377Q等。 ④ 十六进制常量以字母H结尾,由若干个0~9的数字或 A~F的字母所组成的序列。 (2)字符串常量字符串常量是由包含在单引号内的1或2 个ASCII字符构成的。 4.标识符(Identifiers)标识符是由程序员自由建立起来的、 有特定意义的字符序列,如例子中的SUM、 CYCLE、PORT_VAL等。 一个标识符是由最多为31个字母、数 字及规定的特殊字符(? @ _ $)等组成的, 且不能用数字打头(以免与十六进制数相 混淆)。 下面是一些标识符的例子:X GAMMA JACKS THIS_DONE THISDONE 5.保留字(Reserved Words)保留字看上去像标识符,但是它们在 语言中有特殊的意义,而且不能用它们作 为标识符。 表4-1(1)指令助记符 AAA AAD CLD CLI ESC HLT JAE JB JNA JNAEIBM宏汇编中的保留字JNP JNS JNZ LDS LEA MOV MOVS POPF PUSH RET ROL STC SRDAAM AAS ADC ADDCMC CMP CMPS CWDIDIV IMUL IN INCJBE JCXZ JE JGJNB JNBE JNE JNGJO JP JPE JPOLES LOCK LODS LOOPMUL NEG NIL NOPPUSHF RCL RCR REPROR SAHF SAL SARSTI STOS SUB TESTANDCALL CBWDAADAS DECINTINTO IRETJGEJL JLEJNGEJNL JNLEJSJZ LOOPNZLOOPELOONE OUTNOTOR REPNZREPEREPNE SHLSBBSCAS XLATWAITXCHGCLCDIVJAJMPJNOLAHFLOOPZPOPREPZSHRXOR 续表(2)寄存器名AHBHCHDHBPSPESALBLCLDLSICSSSAXBXCXDXDIDS(3)伪指令 ASSUME CODEMACRO END ENDM EXTRN GROUP NOSEGFIX ORG PROC PUBLIC PURGE MACRO ENDMDBENDPLABELRECORDDDENDSMODRMRELBSEGFIXDWEQUNAMERELWSEGMENT 续表(4)其他保留字EQINPAGEMASKNOTHINGPROCLENSTACKFARLEMEMORYOFFSETPTRTHISGELENGTHMODPAGESEGTYPECTLOWNEPARASHORTWIDTHHIGHLTNEARPREFIXSIZE 6.注释(Comment)为了使汇编语言的源程序更便于阅读 和理解,常在源程序中加上注释。 注释是在分号(;)后面的任意的字 符序列,直到行的结尾。 在汇编时,汇编程序对它们并不进行 处理。 在可打印的文件中,注释和源程序一 起打印。 4.2.2 符号(Symbol)1.寄存器(Registers) 2.变量(Variable) 所有的变量都具有三种属性: (1)段值(SEGMENT),即变量单元所在 段的段地址(段的起始地址)的高16位, 低4位始终为0。 (2)偏移量(OFFSET),即变量单元地址 与段的起始地址之间的偏移量(16位)。 (3)类型(TYPE),变量有三种类型:字 节(Byte)、字(word)和双字 (Double Word)。 3.标号(Label) 4.数 5.其他符号 4.2.3 表达式(Expressions)1.操作数(Operands) 一个操作数或者是一个寄存器名,或 是一个常量(数字常量或字符串常量), 或是一个存储器操作数。 (1)常量操作数具有数字值的操作数是常量或是表示 常量的标识符(符号)。 例中的常量操作数是100、 PORT_VAL。 常量操作数的值的允许范围是从 ?65535~+65535。 (2)存储器操作数存储器操作数,通常是标识符。 具体地说,可以分成标号(Label)和 变量(Variable)两种。 变量可以具有以下几种寻址方式:① 直接寻址 ② 基址寻址 ③ 变址(索引)寻址 ④ 基址变址寻址 2.运算符(Operators)① 算术运算符(Arithmetic Operators) ② 逻辑运算符(Logical Operators) ③ 关系运算符(Relational Operators) ④ 分析运算符(Analytic Operators) ⑤ 合成运算符(Synthetic Operators) (1)算术运算符一个是加(+)、减(?)、乘(*)和 除(/)运算符。 另一个算术运算符是MOD,它产生除法 以后的余数,例如,19/7是2(商是2),而 19MOD7是5(余数是5)。 因此,对例子中的存储器地址作如下运 算: SUM+2 CYCLE-5 NOT_DONE-GO 是有效的表达式。而 SUM-CYCLE (2)逻辑运算符逻辑运算符是按位操作的AND、OR、 XOR和NOT。 10 1010B AND 00
00B 00 1100B OR 11
00B NOT 11
00B (3)关系运算符在IBM宏汇编中有以下关系运算符:① 相等Equal(EQ) ② 不等Not Equal(NE) ③ 小于Less Than(LT) ④ 大于Greater Than(GT) ⑤ 小于或等于Less Than or Equal(LE) ⑥ 大于或等于Greater Than or Equal(GE) 若在程序中有以下关系运算: MOV BX, PORT_VAL LT 5 若PORT_VAL的值小于5,关系为真, 则汇编程序在汇编后产生的语句为: MOV BX, 0FFFFH 若PORT_VAL的值不小于5,则关系为 假,汇编后产生的语句为: MOV BX, 0 (4)分析运算符 (5)合成运算符 4.2.4 语句(Statements)一个汇编语言的源程序是由一条条语 句组成的,语句就是对需要计算机完成的 动作的说明。 源程序中的语句可分成两类:指令语 句和指示性语句。 指令语句,汇编程序把它们翻译成机 器代码,这些代码命令8086执行某些操作。 如MOV、ADD、JMP等。 对于指示性语句(伪指令),汇编程 序并不把它们翻译成机器代码,实际上也 不可能翻译成机器代码,只是用来指示、 引导汇编程序在汇编时做一些操作,如定 义符号、分配存储单元、初始化存储器等, 所以伪指令本身不占用存储单元,例如: MY_PLACE DB ? 指令语句的格式为: 标号:助记符 参数, …, 参数;注释 指示性语句的格式为: 名字 命令 参数, …, 参数 ;注释 4.3 指示性语句(Directive Statements)在IBM宏汇编中有以下几种指示性语句: (1)符号定义语句(Symbol definition) (2)数据定义语句(Data definition) (3)段定义语句(Segmentation definition) (4)过程定义语句(Procedure definition) (5)结束语句(Termination) 4.3.1 符号定义语句1.等值语句EQUNAME EQU EXPRESSION一些例子如下:BOILING_POINT EQU BUFFER_SIZE EQU NEW_PORT EQU COUNT EQU CBD EQU 212 32 PORT_VAL+1 CX AAD 2.等号(Equal sign)=语句EMP = 6 EMP = 7 EMP = EMP + 1 3.解除语句PURGEPURGE语句的格式为: PURGE 符号1, 符号2, …, 符号n 例如: PURGE NEW_PORT NEW_PORT EQU PORT_VAL+10 4.3.2 数据定义语句数据定义语句,为一个数据项分配存 储单元,用一个符号名与这个存储单元相 联系,且为这个数据提供一个任选的初始 值。 与数据项相联系的符号名称为变量。 以下是数据定义语句的例子: THING DB ? ;定义一个字节 BIGGER_THING DW ? ;定义一个字 BIGGEST_THING DD ?;定义一个双字 例如: THING DB 25 不仅使THING这个符号与一个字节的 存储单元相联系,而且在汇编时会把25放 入与THING相联系的存储单元中。 所以THING是一个字节变量,它的初 始值为25。 同样,以下语句: BIGGER_THING DW 4142H 在汇编时就会把41H与42H分别放至与 BIGGER_THING相联系的两个连续的字节 单元中(一个字中),而且42H放在地址低 的字节,41H放在地址高的字节。 所以,若BIGGER_THING是一个字变 量,则它的初始值为4142H。 语句 BIGGEST_THING DD H 在汇编时的初始化如图4-3所示。 它定义了一个双字变量,且给了初始 值。 IN_PORT DB PORT_VAL OUT_PORT DB PORT_VAL+1 其中,PORT_VAL已由EQU语句赋了 值。 图4-3定义双字的数据定义语句的作用 一个存储单元的类型如下: (1)数据字节 SUM DB ? ;定义一个字节 (2)数据字(两个连续的字节) BIGGER DW ? ;定义一个字 (3)数据双字(四个连续的字节) BIGGEST DD ? ;定义一个双字 (4)Near指令单元 CYCLE: CMP SUM, 100 (5)Far指令单元 若在一个程序中,对它的数据段有如 下定义: DATA_TABLES SEGMENT BUFFER1 DB 100 DUP(0) BUFFER2 DW 200 DUP(20H) BUFFER3 DD 100 DUP(13) DATA_TABLES ENDS 其中的每一个存储单元都有一些属性 (或组成部分)。 分析运算符SEG,返回的是一个存储 单元的段地址(即它所在段的起始地址); OFFSET运算符返回的是每一个存储单元 地址的段内偏移量,即它与段地址之间的 偏差。故: SEG BUFFER1 SEG BUFFER2 SEG BUFFER3 都是相同的,它们返回的地址都是 DATA_TABLES的地址。 所以,若要对数据段寄存器初始化, 则可以采用指令: MOV AX, SEG BUFFER1 MOV DS, AX 而 OFFSET BUFFER1 OFFSET BUFFER2 OFFSET BUFFER3 是各不相同的。若要向这些缓冲区填 入新的数据,可以用一些地址指针,则可 以用以下指令来初始化地址指针: MOV BX, OFFSET BUFFER1 MOV SI, OFFSET BUFFER2 MOV DI, OFFSET BUFFER3 以后,就可以用这些指针来间接寻址 这些缓冲区。 表4-2存储器操作数 数据字节 数据字 数据双字存储器地址操作数的类型值类 型 部 分 1 2 4NEAR指令单元FAR指令单元?1?2 4.3.3 段定义语句段定义的主要命令有①SEGMENT,② ENDS,③ASSUME,④ORG。 SEGMENT和ENDS语句把汇编语言源 程序分成段。 这些段就相应于存储器段,在这些存 储器段中,存放相应段的目标码。 下面的程序是一个简单的例子,它说 明了如何使用SEGMENT、ENDS和 ASSUME命令,以定义代码段、堆栈段、 数据段和附加段。 MY_DATA SEGMENT X DB ? Y DW ? Z DD ? MY_DATA ENDS MY_EXTRA SEGMENT ALPHA DB ? BETA DW ? GAMMA DD ? MY_EXTRA ENDS MY_STACK SEGMENT DW 100 DUP(?) TOP EQU THIS WORD MY_STACK ENDS MY_CODE SEGMENT ASSUME CS:MY_CODE, DS: MY_DATA ASSUME ES:MY_EXTRA, SS: MY_STACK START:MOV AX, SEG X MOV DS, AX MOV AX, SEG ALPHA MOV ES, AX MOV AX, MY_STACK MOV SS, AX MOV SP, OFFSET TOP MY_CODE ENDS END START (1)不要搭接,段中的第一个可用字节是在 16字节界限上。 MY_SEG SEGMENT MY_SEG ENDS 这是一种正常情况。 (2)允许搭接,但第一个可用字节必须在字 的界限上。 MY_SEG SEGMENT WORD MY_SEG ENDS (3)段开始在指定的16个字节界值上,但第 一个可用字节在指定的偏移位置上。 MY_SEG SEGMENT AT 1A2BH ;段地址 为1A2BH ORG 0003H ;段内从偏移量0003H开始 MY_SEG ENDS 在最后这个例子中,介绍了另一个语 句ORG(Origin),它规定了段内的起始 地址。 伪指令ORG 的一般格式为: ORG &表达式& 此语句指定了段内在它以后的程序或 数据块存放的起始地址,也即以语句中的 表达式的值作为起始地址,连续存放,除 非遇到一个新的ORG语句。 4.3.4 过程定义语句过程定义语句的格式为: PROCEDURE_NAME PROC [NEAR] 或 PROCEDURE_NAME PROC FAR RET PROCEDURE NAME ENDP 下面是一个过程定义的例子: MY_CODE SEGMENT UP_COUNT PROC NEAR ADD CX, 1 RET UP_COUNT ENDP START: CALL UP_COUNT CALL UP_COUNT HLT MY_CODE ENDS END START 4.3.5 结束语句START: END START 4.4 指 令 语 句 4.4.1 指令助记符1.NOP(No Operation) 2.保留空格(Place Holder) 4.4.2 指令前缀LOCK REP (Repeat) REPE (当相等时重复) REPNE (当不相等时重复) REPZ (当标志ZF=1时重复) REPNZ (当标志ZF=0时重复) 具有前缀的指令语句的例子为: CYCLE: LOCK DEC COUNT 4.4.3 操作数寻址方式1.立即(Immediate) MOV AX, 15 ;15是一个立即数 2.寄存器(Register) MOV AX, 15 ;AX是一个寄存器操作数 3.直接(Direct) SUM DB ? MOV SUM, 15 ;SUM是一个直接存储器操 作数 4.通过基址寄存器间接(Indirect Through Base Register) MOV AX,[BX] MOV AX,[BP] 5.通过变址寄存器间接(Indirect Through Index Register)MOV AX,[SI] MOV AX,[DI] 6.通过基址寄存器加变址寄存器间接(Indirect Through Base Register Plus Index Register)MOV MOV MOV MOVAX,[BX][SI] AX,[BX][DI] AX,[BP][SI] AX,[BP][DI] 7.通过基址或变址寄存器加位移量间接MANY_BYTES DB 100 DUP(?) MOV AX, MANY_BYTES[BX] MOV AX, MANY_BYTES[BP] MOV AX, MANY_BYTES[SI] MOV AX, MANY_BYTES[DI] 8.通过基址寄存器加变址寄存器加位移量间接MANY_BYTES MOV [SI] MOV [DI] MOV [SI] MOV [DI]DB 100 DUP(?) AX, MANY_BYTES[BX] AX, MANY_BYTES[BX]AX, MANY_BYTES[BP] AX, MANY_BYTES[BP] 4.4.4 串操作指令ALPHA DB BETA DB MOV MOV MOVS ? ? SI, OFFSET ALPHA DI, OFFSET BETA BETA, ALPHA 下面我们通过一个例子来说明:一个 完整的汇编语言源程序应该由哪些部分组 成。 例子是把两个分别由未组合的BCD码 (一个字节为一位BCD数)的串相加。 由于8086中允许两个未组合的十进制 数相加,只要经过适当调整就可以得到正 确的结果。 所以,在程序中把第一个串的一位 BCD数取至AL中,与第二个串的相应位相 加,经过AAA调整,再把结果存至存储器 中。 程序中的前面部分是为了设置段,先 设置数据段,用DB伪指令定义两个数据串, 用COUNT表示数据的长度。 接着是定义堆栈段,为堆栈留下了100 个单元的空间(实际上当然要由需要来 定),然后是定义代码段,从标号GO开始 就是可执行指令部分。 程序如下: NAME ADP_TWO_BCD_STRING DATA SEGMENT STRI1 DB '1', '7', '5', '2' STRI2 DB '3', '8', '1', '4' COUNT EQU $-STRI2 DATA ENDS STACK SEGMENT PARA STACK 'STACK' STAPN DB 100 DUP(?) TOP EQU LENGTH STAPN STACK ENDS CODE SEGMENT ASSUME CS:CODE, SS:STACK, DS:DATA, ES:DATA STATR PROC FAR PUSH DS MOV AX, 0 PUSH AX GO:MOV AX, DATA MOV DS, AX MOV ES, AX MOV AX, STACK MOV SS, AX MOV AX, TOP MOV SP, AX CLC CLD MOVSI, OFFSET STRI1 MOV DI, OFFSET STRI2 MOV CX, COUNT CYCLE: LODS STRI1 ADC AL,[DI] AAA STOS STRI2 LOOP CYCLE RET STATR ENDP CODE ENDS END START 程序中的 DATA SEGMENT DATA ENDS 4.5 汇编语言程序设计及举例 4.5.1 算术运算程序设计(直线运行 程序)例4-1 两个32位无符号数乘法程序。 NAME 32 BIT MULTIPLY DATA SEGMENT MULNUM DW 0000, 0FFFFH, 0000, 0FFFFH, 4 DUP(?) DATA ENDS STACK SEGMENT PARA STACK ‘STACK’ DB 100 DUP(?) STACK ENDS CODE SEGMENT ASSUME CS :CODE, DS :DATA, SS :STACK, ES :DATA START PROC FAR BEGIN: PUSH DS ;DS中包含 的是程序段前缀的起始地址 MOV AX, 0 PUSH AX ;设置返回至 DOS的段值和IP值 MOV AX, DATA MOV DS, AX ES, AX ;置段寄存器初值 LEA BX, MULNUM MULU32:MOV AX, [BX] ;B→AX MOV SI, [BX+4] ;D→SI MOV DI, [BX+6] ;C→DI MULSI ; B× D MOV MOV[BX+8], AX ;保存部分积1 MOV [BX+0AH], DX MOV AX, [BX+2] ;A→AX MULSI ; A× D ADDAX, [BX+0AH] ADCDX, 0 ;部分积2的一部分与部分 积1的相应部分相加 MOV [BX+0AH], AX MOV [BX+0CH], DX ;保存 MOV AX, [BX] ;B→AX 图4-4用16位乘法指令实现32位乘法的程序流程图 MULDIADDAX, [BX+0AH] 积3的相应部分相加 ADCDX, [BX+0CH] MOV [BX+0AH], AX MOV [BX+0CH], DX PUSHF ;保存后一次 相加的进位位; B× C ;与部分 MOVAX, [BX+2] ;A→AX MULDI ; A× C POPF ADCAX, [BX+0CH] ;与部分 积4的相应部分相加 ADCDX, 0 MOV [BX+0CH], AX MOV [BX+0EH], DX RET START CODEENDP ENDS END BEGIN 4.5.2 分支程序设计1 y= 0 ?1当x&0 当x=0 当x&0 SIGEFMOV OR JE JNS MOV JMPAX, BUFFER AX, AX ZERO PLUS BX, 0FFH CONTI ZERO: MOV JMP PLUS: MOV CONTI:BX, 0 CONTI BX, 1 图4-5符号函数的程序流程图 4.5.3 循环程序设计1.用计数器控制循环 例4-2 在一串给定个数的数中寻找最 大值(或最小值),放至指定的存储单元。 每个数用16位表示。 NAME SEARCH_MAX DATA SEGMENT BUFFER DW X1, X2, ..., Xn COUNT EQU $ - BUFFER MAX DW ? DATA ENDS STACK SEGMENT PAPA STACK 'STACK' DB 64 DUP(?) TOP EQU $ - STACK STACK ENDS CODE SEGMENT START PROC FAR ASSUME CS:CODE, DS:DATA, SS: STACK BEGIN: PUSH DS MOV AX, 0 PUSH AX MOV AX, DATA MOV DS, AX MOV AX, STACK MOV SS, AX MOV AX, TOP MOV SP, AX MOV CX, COUNT LEA BX, BUFFER MOV AX,[BX] INC BX DEC CX AGAIN: CMP AX,[BX] JGE NEXT MOV AX,[BX] NEXT: INC BX LOOP AGAIN START ENDP CODE ENDS END BEGIN 2.多重循环下面是一个多重循环的例子(没有精 确计算延时时间): DELAY: MOV DX, 3FFH TIME MOV AX, 0FFFFH TIME1 DEC AX NOP JNETIME1 DEC JNE RETDX TIME 4.5.4 字符串处理程序设计1.确定字符串的长度 例4-3 从头搜索字符串的结束标志, 统计搜索的字符个数,其流程图如图4-6所 示。 相应的程序为: NAME LENGTH_OF_STRING DATA SEGMENT STRING DB 'ABCDUVWXYZ', 0DH LL DB ? CR EQU 0DH DATA ENDS STACK SEGMENT PARA STACK 'STACK' DB L00DUP(?) STACK ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA, ES:DATA, SS:STACK START PROC FAR BEGIN: PUSH DS MOV AX, 0 PUSH AX MOV AX, DATA MOV DS, AX MOV ES, AX LEA MOV MOV AGAIN: JE INC JMPDI, STRING ;设串的地址指针 DL, 0 ;置串长度初值为0 AL, CR ;串结束标志→AL SCASB ;搜索串 DONE ;找到结束标志,停止 DL ;串长度加1 AGAIN DONE: LEA BX, LL MOV [BX], DL RET START ENDP CODE ENDS END BEGIN 图4-6确定字符串长度的流程图 2.加偶校验到ASCII字符例4-4 若有一个ASCII字符串,它的起 始地址放在单元STRING内,要求从串中取 出每一个字符,检查其中包含的“1”的个 数,若已为偶数,则它的最高有效位置 “0”;否则,最高有数位置“1”,然后送 回。 其流程如图4-7所示。 图4-7加偶校验位至ASCII字符 相应的程序为:NAME PARITY_CHECK DATA SEGMENT STRING DB '' COUNT EPU $ - STRING DATA ENDS STACK SEGMENT PARA 'STACK' DB 100 DUP(?)STACK STACK ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA, ES:DATA, SS:STACK START PROC FAR BEGIN: PUSH DS MOV AX, 0 PUSH AX MOV AX, DATA MOV DS, AX MOV ES, AX LEA SI, STRING MOV CX, COUNT AGAIN: LODSB AND AL, AL JPE NEXT OR AL, 80H MOV [SI - L], AL NEXT: DEC JNZ RET START ENDP CODE ENDS ENDCX AGAINBEGIN 4.5.5 码转换程序设计1.十六进制到ASCII的转换 例4-5 若有一个二进制数码串,要把 每一个字节中的二进制转换为两位十六进 制数的ASCII,高4位的ASCII放在地址高的 单元。串中的第一个字节为串的长度(小 于128)。 能实现这样转换的流程如图4-8所示。 相应的程序为: NAME HEX_CHANGE_TO_ASCII DATA SEGMENT L1 DW 2 STRING DB 34H, 98H 12 DW ? BUFFER DB 2*2 DUP(?) DATA ENDS STACK SEGMENT PARA STACK 'STACK' DB 100 DUP(?) STACK ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA, ES:DATA, SS:STACK START PROC BEGIN: PUSH MOV PUSH MOV MOV MOV MOVFAR DS AX, 0 AX AX, DATA DS, AX ES, AX CX, LL LEABX, STRING LEA SI, BUFFER MOV AX, CX SAL CX, 1 MOV 12, CX MOV CX, AX AGAIN: MOV AL, [BX] MOV AND CALL MOV PUSH MOV SHR POPDL, AL AL, 0FH CHANGE AL, DL CX CL, 4 AL, CL CX CALLCHANGE INC BX LOOP AGAIN RET START ENDP CHANGE PROC CMP AL, 10 JL ADD_0 ADD AL, 'A'-'0'-10 ADD_0:CHANGE CODEADD AL, '0' MOV [SI], AL INC SI RET ENDP ENDS END BEGIN 图4-8(a ) (b ) 把十六进制数转换为ASCII的程序流程图 2.从二进制到ASCII串的转换例4-6 把在内存变量NUMBER中的16 位二进制数,每一位转换为相应的ASCII, 存入串变量STRING中,其流程如图4-9所 示。 相应的程序为:NAME BINARY_TO_ASCII DATA SEGMENT NUM DW 4F78H STRING DB 16 DUP(?) DATA ENDS STACK SEGMENT PARA STACK 'STACK' DB 100 DUP(?) STACK CODEENDS SEGMENT ASSUME CS:CODE, DS:DATA, ES:DATA, SS:STACK START PROC FAR BEGIN: PUSH DS MOV AX, 0 PUSH AX MOV AX, DATA MOV DS, AX 图4-9把二进制位串的每一位转换为ASCII的程序流程图 MOV LEA MOV PUSH PUSH MOV “0”ES, AX DI, STRING CX, LENGTH STRING DI CX AL, 30H ;使缓冲区全置为 REP POP POP MOV MOVSTOSP CX DI AL, 31H BX, NUM AGAIN: RCL BX, L ;左移BX,把相 应位进入C标志 JNC NEXT ;若为零则转至NEXT MOV [DI], AL ;若为“1”,则把 “1”置入缓冲区 NEXT: INC DI LOOP AGAIN RET START ENDP CODE ENDS END BEGIN 4.5.6 有关I/O的DOS功能调用1.在CRT上连续输出字符0~9 MOV DL, OUTPUT_CHAR MOV AH, 2 INT 21H 图4-10在CRT上输出0~9的程序流程图 相应的程序为: NAME OUTPUT_CHAR_0_9 STACK SEGMENT PARA STACK 'STACK' DB 100 DUP(?) STACK ENDS CODE SEGMENT ASSUME CS:CODE, SS: STACK START PROC BEGIN: PUSH MOV PUSH MOV PUSH GOON: MOV →DL MOVFAR DS AX, 0 AX BL, 0 BX D1, 20H ;把空格字符 AH, 2 INTPOP MOV INC DAA21H ;输出空格字符 BX AL, BL AL ;增量后进行十进制调整 ANDAL, 0FH MOV BL, AL PUSH BX OR AL, 30H ;转换为ASCII码 MOV D1, AL MOV AH, 2 INT 21H ;输出一个0~9之间的字符 MOV CX, 0FFFFH ;为便于观察,插 入一定的延时 AGAIN: DEC CX JNE AGAIN JMP GOON START ENDP CODE ENDS END BEGIN 2.在CRT上连续显示00~59相应的程序为: NAME OUTPUT_CHAR_00_59 STACK SEGMENT PARA STACK 'STACK' DB 100 DUP(?) STACK ENDS DATA SEGMENT BUFFER DB 3 DUP(?) DATA CODEENDS SEGMENT ASSUME CS:CODE, DS: DATA, SS:STACK START PROC FAR BEGIN: PUSH DS MOV AX, 0 PUSHAX MOV MOV MOV 的循环次数 MOV LEA PUSHAX, DATA DS, AX CX, 1000 ;设置最大 BL, 0 SI, BUFFER BX GOON: MOV MOV INT 21H MOV MOVD1, 0DH AH, 2 ;输出回车符 D1, 0AH AH, 2 ;输出换行符 INT 21H POP MOV INC DAA CMP JC MOVBX AL, BL ALAL, 60H NEXT AL, 0 ;AL增加到60了吗? ;未达到,转去显示 ;到60,置为0 NEXT: MOV PUSH MOV PUSH MOV SHRBL, AL BX D1, AL CX CL, 4 AL, CL OR AL, 30H ;把AL中十位数,转换为 ASCII MOV [SI], AL INC SI MOV AL, DL AND AL, 0FH OR AL, 30H ;把AL中的个位数,转 换为ASCII MOV INC MOV MOV MOV MOV INT MOV[SI], AL SI AL, '$' [SI], AL DX, OFFSET BUFFER AH, 9 21H ;输出字符串 CX, 0FFFFH AGAIN: DEC JNE POP DEC JE MOV JMPCX AGAIN CX CX DONE SI, OFFSET BUFFER GOON DONE: START CODE ENDRET ENDP ENDS BEGIN 图4-11在CRT上连续显示00~59的程序 4.5.7 宏汇编与条件汇编1.宏指令的用途 (1)在汇编语言的源程序中,若有的程序段 要多次使用,为了使在源程序中不重复书 写这个程序段,可以用一条宏指令来代替。 由宏汇编程序在汇编时产生所需要的代码。 MOV CL, 4 SAL AL, CL 若要多次使用,就可以用一条宏指令代替。 如下所示: SHFT MACRO MOV CL, 4 SAL AL, CL ENDM (2)宏定义不但能使源程序的书写简洁,而 且由于宏指令具有接收参量的能力,所以 功能就更灵活。 SHIFTMACRO X MOV CL, X SAL AL, CL ENDM SHIFTMACRO X, Y MOV CL, X SAL Y, CL ENDM SHIFT 4, AL SHIFT 4, BX SHIFT 6, DI 这些宏指令在汇编时,分别产生以下 指令的目标代码: MOV CL, 4 SAL AL, CL MOV CL, 4 SAL BX, CL MOV CL, 6 SAL DI, CL (3)形式参量不只可以出现在操作数部分, 也可以出现在操作码部分。如: SHIFT MACRO X, Y, Z MOV CL, X S&Z Y, CL ENDM 若有以下调用: SHIFT 4, AL, AL SHIFT 6, BX, AR SHIFT 8, SI, HR 在汇编时,分别产生以下指令的目标 代码。 MOV CL, 4 SAL AL, CL MOV CL, 6 SAR BX, CL MOV CL, 8 SHR SI, CL 2.IBM宏汇编中主要宏操作伪指令(1)MACRO 其一般格式为: 宏定义名 MARCO &形式参量表& (2)PURGEPURGE伪指令的格式为: PURGE 宏定义名[, …] (3)LOCAL例如在AL中有一位十六进制数码要转 换为ASCII,则可以用以下宏定义: CHANGE MACRO CMP AL, 10 JL ADD_0 ADD AL, 'A'-'0'-10 ADD_0 ADD AL, '0' ENDM 上面的CHANGE宏定义在有多次调用的情况 下,应定义为:CHANGE MACRO LOCAL ADD_0 CMP AL, 10 JL ADD_0 ADD AL, 'A'-'0'10 ADD_0 ADD AL, '0' ENDM 若有宏调用: CHANGE CHANGE 在宏汇编展开时为: + CMP AL, 10 + JL ??0000 + ADD AL, 'A'-'0'-10 +??0000ADD AL, '0' + CMP AL, 10 + JL ??0001 + ADD AL, 'A'-'0'-10 +??0001 ADD AL, '0' (4)REPT其一般格式为: REPT &表达式& 指令体 ENDM 这个伪指令可以重复执行在它的指令 体部分所包含的语句。重复执行的次数, 由表达式的值所决定。如: X= 0 REPT 10 X= X + 1 DB X ENDM 它把1~10分配给十个连续的存储单元。 利用这个伪指令可以对某个存储区赋 值(建立一个表)。 例4-7 把数字0~9的ASCII填入表TABLE。 CHAR= '0' TABLE LABEL BYTE REPT 10 DB CHAR CHAR = CHAR+1 ENDM 例4-8 建立一个地址表,其中每个字 的内容是下一个字的地址(用作地址指 针),而最后一个字的内容是第一个字的 地址。 TABLE LABEL WORD REPT 99 DW $ + 2 ENDM DW TABLE (5)IRP其一般格式为: IRP 形式参量(参数表) 指令体 ENDM IRP X &1, 2, 3, 4, 5, 6, 7, 8, 9, 10& DB X ENDM (6)IRPC其一般格式为: IRPC 形式参量, 字符串(或〈字符串〉) 指令体 ENDM IRPC X,
DB X + 1 ENDM 3.宏定义嵌套DIFMACRO MOV SUB ENDM DIFSQR MACRO PUSH PUSHN1, N2 AX, N1 AX, N2N1, N2 RESULT DX AX DIF IMUL MOV POP POP ENDMN1, N2 AX RESULT, AX AX DX 4.宏指令与子程序的区别(1)宏指令是为了简化源程序的书写,在汇 编时,汇编程序处理宏指令,把宏定义体 插入到宏调用处。 所以,宏指令并没有简化目标程序。 有多少次宏调用,在目标程序中仍需 要有同样多次的目标代码插入。 所以,宏指令不能节省目标程序所占 的内存单元。 (2)把上述两者的特点加以比较,可以看出: 若在一个源程序中多次调用一个程序段, 则可用子程序,也可以用宏指令来简化源 程序。 用子程序的方法,汇编后产生的目标 代码少,也即目标程序占用的内存空间少, 节约了内存空间。 但是,子程序在执行时,每调用一次 都要先保护断点,通常在程序中还要保护 现场;在返回时,先要恢复现场,然后恢 复断点(返回)。 这些操作都额外增加了时间,因而执 行时间长,速度慢。 而宏指令恰好相反,它的目标程序长, 占用的内存单元多;但是执行时不需要保 护断点,也不需要保护现场以及恢复、返 回等这些额外的操作,因而执行时间短、 速度快。 5.条件汇编IF XX ARGUMENT (语句体1) [ELSE] (任选) (语句体2) ENDIF
更多搜索:
赞助商链接
All rights reserved Powered by
文档资料库内容来自网络,如有侵犯请联系客服。}

我要回帖

更多关于 spss中sig是什么意思 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信