第5章基本控制结构_第1页
第5章基本控制结构_第2页
第5章基本控制结构_第3页
第5章基本控制结构_第4页
第5章基本控制结构_第5页
已阅读5页,还剩70页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

2023/10/1080x86汇编语言程序设计第5章基本控制结构

讲授要点系统功能子程序的调用字符与字符串的输入/输出方法双分支与多分支结构循环程序的控制方法串操作指令及其用途2023/10/1080x86汇编语言程序设计5.1系统功能子程序的调用通过软中断方式调用外部设备管理程序。中断指令格式:INT n执行操作:PUSHPSW,0→TF、IF,PUSHCS,PUSHIP,入口地址→CS、IP;调用格式:送入口参量到指定寄存器功能号→AHINT n2023/10/1080x86汇编语言程序设计DOS功能子程序的调用调用格式:MOVCX/DX[DL],参数

MOVAH,功能号

INT21H功能号入口寄存器功能1H无等待键盘输入,把字符的ASCII码值存入AL并在屏幕上显示字符。2HDL将DL中的字符显示在屏幕上。5HDL将DL中的字符打印出来8H无等待键盘输入,把字符的ASCII码值存入AL。9HDX将一个字符串显示在屏幕上,字符串以‘$’做结束,DX存字符串的首地址。2023/10/1080x86汇编语言程序设计DOS功能调用表(续)功能号入口寄存器功能0AHDX从键盘输入字符串到指定的存储区中,字符串以回车键结束,DS、DX指向指定的存储区的段基值和偏移量。2AH无读出系统日期,其中年存入CX,月存入DH,日存入DL,星期存入AL。2BHCX、DX设置系统日期,其中年存入CX,月存入DH,日存入DL。AL=0表示设置成功。2CH无读出系统时间,其中时存入CH,分存入CL,秒存入DH,百分秒存入DL。2DHCX、DX设置系统时间,其中时存入CH,分存入CL,秒存入DH,百分秒存入DL。AL=0表示设置成功。2023/10/1080x86汇编语言程序设计BIOS功能子程序的调用调用格式:MOVAH,功能号

INTn中断号功能10H显示器输出控制中断调用。如09H功能号,在光标处输出一字符。13H磁盘输入输出功能。包括复位、读写扇区数据等。14H异步通信口输入输出控制功能。包括读、写数据等。16H键盘输入控制功能。17H打印机输出控制功能。2023/10/1080x86汇编语言程序设计5.2字符与字符串的输入/输出方法DOS系统调用INT21H提供了字符及字符串的I/O功能,例如:

01H:从键盘读入一个字符

02H:显示一个字符

09H:显示一个字符串

0AH:从键盘读入一个字符串

2023/10/1080x86汇编语言程序设计5.2字符与字符串的输入/输出方法1.从键盘读入一个字符功能号:01H

出口参数:AL=输入字符的ASCII码功能:等待从键盘读入一个字符,将其ASCII码送入AL,同时将该字符显示在屏幕上。调用方法:

mov ah,1 int 21h

说明:输入一个字符后,不需要回车。若只键入回车,则AL=0DH。

2023/10/1080x86汇编语言程序设计5.2字符与字符串的输入/输出方法2.显示一个字符功能号:02H

入口参数:DL=要显示字符的ASCII码功能:在当前光标位置显示DL中的字符,光标右移。调用方法示例:

mov dl,'A' ;显示字符'A' mov ah,2 int 21h

说明:显示字符0DH和0AH将产生回车和换行的作用。

2023/10/1080x86汇编语言程序设计5.2字符与字符串的输入/输出方法

3.显示一个字符串功能号:09H

入口参数:DS:DX=欲显示字符串在内存的首地址,且字符串必须以'$'(24H)作为结束符。功能:在当前光标位置,显示由DS:DX所指的、以'$'结尾的字符串,且光标右移。其中,'$'不算在显示的字符串之内。

2023/10/1080x86汇编语言程序设计调用方法示例:

String db 'Hello!','$' ;显示字符串'Hello!' mov ax,segString mov ds,ax mov dx,offsetString mov ah,9 int 21h 2023/10/1080x86汇编语言程序设计5.2字符与字符串的输入/输出方法

4.从键盘读入一个字符串功能号:0AH

入口参数:DS:DX=输入缓冲区首地址输入缓冲区格式:第0字节事先设置为缓冲区最多能容纳的字符个数(包括回车);第1字节将存放实际字符个数(不包括回车),由系统自动设置;从第2字节开始存放实际输入的字符串,最后为回车符。功能:从键盘读入一个字符串,存入DS:DX所指的缓冲区。

2023/10/1080x86汇编语言程序设计调用方法示例:

buf db 10,?,10dup(?) ;定义输入缓冲区

mov ax,segbuf mov ds,ax lea dx,buf mov ah,0ah int 21h 2023/10/1080x86汇编语言程序设计5.2字符与字符串的输入/输出方法5.字符与字符串的输入/输出举例

DOS系统调用只提供了字符与字符串的输入/输出方法。如果要输入/输出其它类型的数据,如常用的整数,则必须由应用程序来实现与字符之间的转换。例如,欲输出整数126,只能以字符(串)的方式输出'1'、'2'、'6'。对于程序员来说,在需要用户输入时给出输入提示,对输入数据进行有效性检查,在输出结果时说明其表示的含义,是一种好的设计习惯。2023/10/1080x86汇编语言程序设计5.3顺序结构

5.3.1简单程序设计dseg segment use16

... ;数据定义(DB/DW/DD)dseg endseseg segment use16

... ;数据定义(DB/DW/DD)eseg endssseg segment stackuse16 dw 512dup(?) sseg endscsegsegmentuse16assumecs:cseg,ds:dseg,es:eseg,ss:ssegstart:movax,dsegmovds,axmovax,esegmoves,ax

.. ;指令序列

movah,4chint 21;程序退出,返回DOScsegendsendstart2023/10/1080x86汇编语言程序设计5.4分支结构

5.4.1JMP指令的灵活运用

用JMP指令实现转移的多种方法:使用标号,近转移使用标号,远转移以通用寄存器表示目标偏移地址以内存变量表示目标偏移地址以内存变量表示目标的32位分段地址2023/10/1080x86汇编语言程序设计(一)、控制转移指令1、无条件转移指令基本格式:JMPTARGET①、段内直接短转移指令格式:JMP[SHORT]TARGET;TARGET为转移的目的地址(相对寻址)。执行操作:IP+8位有符号数→IP

源与目的地址之间要保持在-128---+127范围内。②、段内直接近转移指令格式:JMP[NEARPTR]TARGET;TARGET为转移的目的地址(相对寻址)。执行操作:IP+16位符号数→IP

源与目的地址之间要保持在-32768---+32727范围内。2023/10/1080x86汇编语言程序设计③、段内间接转移指令格式:JMPWORDPTROPR;OPR为通用寄存器/存储器字单元,目标地址为其内的数据(间接寻址)。执行操作:R→IP或[EA]→IP

例:JMPBX、JMPWORDPTR[BX]④、段间转移指令格式:JMPDWORDPTROPR;OPR为存储器双字单元(间接寻址)。执行操作:(EA)→IP,(EA+2)→CS例:JMPDWORDPTR[BX]、

JMPDWORDPTR10H[BX][DI]2023/10/1080x86汇编语言程序设计2、条件转移指令基本格式:JXXOPR

条件转移只能在段内转移,且转移范围为:-128--127。①、单标志位条件转移指令(10条,简单条件转移)

JZ(或JE)OPR;结果为0(或相等)(ZF=1)时转移;

JNZ(或JNE)OPR;结果不为0(或不相等)(ZF=0)时转移;

JS/JNSOPR;结果为负/正(SF=1/0)时转移;

JO/JNOOPR;结果溢出/无溢出(OF=1/0)时转移;

JP(JPE)/JNP(JPO)OPR;奇偶位为偶/奇(PF=1/0)时转移;

JC/JNCOPR;有/无借位(CF=1/0)时转移;2023/10/1080x86汇编语言程序设计②、无符号数条件转移指令(4条)

JB/JNAEOPR;两个无符号数a、b比较时,若a〈b时转移,(ZF=0ANDCF=1);

JBE/JNAOPR;两个无符号数a、b比较时,若a≤b时转移;(ZF=1ORCF=1)

JA/JNBEOPR;两个无符号数a、b比较时,若a〉b时转移;(ZF=0ANDCF=0)

JAE/JNBOPR;两个无符号数a、b比较时,若a≥b时转移(ZF=1ORCF=0);2023/10/1080x86汇编语言程序设计③、有符号数条件转移指令(4条)

JG/JNLEOPR;两个带符号数a、b比较时,若a〉b时转移;((SF=OF)ANDZF=0)

JGE/JNLOPR;两个带符号数a、b比较时,若a≥b时转移;((SF=OF)ORZF=1)

JL/JNGEOPR;两个带符号数a、b比较时,若a<b时转移;((SF≠OF)ANDZF=0)

JLE/JNGOPR;两个带符号数a、b比较时,若a≤b时转移;((SF≠OF)ORZF=1)2023/10/1080x86汇编语言程序设计(二)、比较/测试分支程序设计比较指令:指令格式:CMPDEST,SRC;执行操作:(DEST)-(SRC)对标志的影响:OF、SF、ZF、AF、PF、CF

根据标志位判断源操作数和目的操作数的大小测试指令:指令格式:TESTDEST,SRC;执行操作:(SRC)∧(DEST)对标志位影响:SF、ZF、PF;源操作数可为:通用寄存器、存储器或立即数。目的操作数不能为立即数,源和目的操作数不能同时在存储器中。2023/10/1080x86汇编语言程序设计分支结构程序流程:IF(C){……}ELSE {……}……程序段1比较/测试条件满足?程序段2YN比较/测试条件满足?程序段YNIF(C){……}……判定条件?程序N程序1

……

CASE(C1):……

CASE(C2):……CASE(C3):……

2023/10/1080x86汇编语言程序设计例:求三个无符号数中的最大值,只要把三个数据两两比较,用JA/JNB/JNA/JC等指令就可判断两数的大小,从而选出其中最大值。2023/10/1080x86汇编语言程序设计DATASEGMENTARGDW7138H,84A6H,29EHMAXDW?DATAENDSSSEGSEGMENTSTACKSTKDB20DUP(0)SSEGENDSCODESEGMENTASSUMECS:CSEG,DS:DSEG,SS:SSEGSTART:MOVAX,DATAMOVDS,AXMOVSS,AXMOVSP,SIZESTKLEASI,ARGMOVAX,[SI]MOVBX,[SI+2]CMPAX,BX2023/10/1080x86汇编语言程序设计JAEFMAX1MOVAX,BXFMAX1:CMPAX,[SI+4]JAEFMAX2MOVAX,[SI+4]FMAX2:MOVMAX,AXMOVAH,4CHINT21HCODEENDSENDSTART2023/10/1080x86汇编语言程序设计例:设数据段中NUM1,NUM2两字节单元有无符号整数,编程完成:1、若两个均是偶数,则两个数分别加1后送DA1、DA2字节单元中;

2、若两个均是奇数,则两个数分别送DA1、DA2字节单元中;

3、若一个是奇数,一个是偶数,则把奇数送DA1,偶数送DA2字节单元中;2023/10/1080x86汇编语言程序设计开始(NUIM1)→AL,(NUM2)→AH(AL)0=0?(AH)0=0?(AL)→(DA1)(AH)→(DA2)结束YYNN(AL+1)→(AL)(AH+1)→(AH)(AH)←→(AL)END0L12023/10/1080x86汇编语言程序设计DATA SEGMENTNUM1DB45HNUM2DB0AEHDA1 DB ?DA2 DB ?DATA ENDSSTACK1SEGMENTPARA STACK STADW 20H DUP(0)STACK1ENDSCOSEGSEGMENT ASSUME CS:COSEG,DS:DATA,SS:STACK1BEGIN:MOVAX,DATA MOVDS,AX2023/10/1080x86汇编语言程序设计 MOVAL,NUM1 MOVAH,NUM2 TESTAL,01H JNEEND0;奇数

TESTAH,01H;偶数

JNE L1 INC AL;双偶数

INC AH JMP END0L1: XCHG AL,AHEND0: MOV DA1,AL MOV DA2,AH MOV AH,4CH INT 21HCOSEG ENDS END BEGIN

2023/10/1080x86汇编语言程序设计例5-7设某程序有8路分支,试根据给定的N值(1~8),将程序的执行转移到其中的一路分支。

2023/10/1080x86汇编语言程序设计程序如下:DATA SEGMENTTAB DWP1,P2,P3,P4,P5,P6,P7,P8NDB5DATA ENDSSTACK SEGMENT DB200DUP(0)STACK ENDSCODE SEGMENT ASSUMEDS:DATA,SS:STACK,CS:CODE2023/10/1080x86汇编语言程序设计 START:

MOV AX,DATA MOV DS,AX

┆ MOV AL,N DEC AL ADD AL,AL;AL=(N-1)*2 MOV BL,AL MOV BH,0 JMP TAB[BX]2023/10/1080x86汇编语言程序设计P1:

……

┆ JMP EXITP2:

……

┆ JMP EXITP2:

……

┆ JMP EXITP3:

……

┆2023/10/1080x86汇编语言程序设计 JMP EXIT

┆P8:

……

┆EXIT:

MOV AH,4CH INT 21HCODE ENDS END START

上述程序中的无条件转移指令的转移地址采用的是变址寻址。同理,转移地址也可以用寄存器间接寻址或基址加变址寻址,读者可自行考虑。2023/10/1080x86汇编语言程序设计5.4.2双分支结构

双分支结构相当于高级语言的IF-THEN-ELSE形式。IF-THEN结构只是IF-THEN-ELSE形式的特例,即ELSE部分为空。通常,使用条件转移指令Jcc与无条件转移指令JMP来实现分支。一般必须先安排比较或算术、逻辑运算等影响标志位的指令,然后用Jcc指令判断条件,以实现分支转移。2023/10/1080x86汇编语言程序设计

对应于IF-THEN-ELSE结构的80x86汇编语言代码形如:

<为测试条件cc做准备> JccElseCode <THEN程序段> jmpEndOfIFElseCode: <ELSE程序段>EndOfIF:

注意,程序隐含是顺序执行的,在THEN分支体执行后,不会自动跳过ELSE分支体,而是继续执行其后的代码。2023/10/1080x86汇编语言程序设计5.4.2双分支结构对应于IF-THEN结构的80x86汇编语言代码形如:

<为测试条件cc做准备> Jcc EndOfIF <THEN程序段>EndOfIF:2023/10/1080x86汇编语言程序设计5.4.3多分支结构

多分支结构相当于高级语言的CASE语句。多分支程序的设计方法主要有:逻辑分解方法将多分支结构以逻辑等效的方法,分解为一串双分支结构。地址表方法在数据段定义一个地址表,依次存放各分支对应处理程序的入口地址。通过将相应处理程序入口地址取入某寄存器,用间接转移指令实现转移。2023/10/1080x86汇编语言程序设计转移表方法在代码段建立一个转移表,依次存放实现各分支的转移指令。通过跳到转移表的相应位置执行其中的转移指令,从而实现转到相应分支的处理程序。2023/10/1080x86汇编语言程序设计5.5循环结构

5.5.1循环结构的基本形式2023/10/1080x86汇编语言程序设计5.5.2循环程序的控制方法(1)计数控制适用于循环次数已知的情况,包括正计数与倒计数两种方法。(2)条件控制在实际问题中,常常有循环次数未知的情况。此时,就必须通过特定条件来控制循环。(3)开关控制

2023/10/1080x86汇编语言程序设计

有时,循环内部又有分支,且每次循环执行的分支具有一定规律,这种结构非常类似于多分支结构。此时,可以采用开关来控制循环。具体方法是:在进入循环前,预置第一次循环的开关走向;在每次循环结束前,设置下一个开关方向,以便执行相应的操作。在实际应用中,开关的形式多种多样。例如,设置一个状态变量,取值0、1和2,分别表示执行的不同操作,就是一个开关。(4)逻辑尺控制如果循环内分支的规律性不强,开关控制方法就难以胜任了。一种较有效的方法就是逻辑尺控制。所谓逻辑尺,就是一个位串,用1位或多位来控制每次循环所执行的操作。

2023/10/1080x86汇编语言程序设计(一)、循环程序结构流程初始化部分循环结束?结束处理DO{……}WHILE(C)NWHILE(C){……}工作部分修改部分Y初始化部分循环结束?结束处理N工作部分修改部分Y2023/10/1080x86汇编语言程序设计(二)、循环控制指令1、LOOP指令指令格式:LOOPTARGET执行功能:CX-1→CX;CX≠0时,(继续循环,)转到TARGET所指的指令,CX=0时,顺序执行。例:编制裴波纳契数数列程序0,1,1,2,3,5,8,……

…… MOV AX,0 MOV BX,1LOP: MOV [DI],AX ADD AX,BX XCHG AX,BX ADD DI,TYPEFIBONA LOOP LOP

……CX←数据个数DI←数据首地址CX=0?AX←AX+BXN(DI)←AXAX←→BXY开始结束CX←CX-1DI←DI+2AX←0,BX←12023/10/1080x86汇编语言程序设计2、LOOPE/LOOPZ指令指令格式:LOOPE/LOOPZTARGET功能:CX-1→CX;若CX≠0且ZF=1时,转到TARGET所指的指令(继续循环),若CX=0或ZF=0时,顺序执行。例:编制寻找字符串‘

CHECKSTRING’中第一个非空格字符。若有,将字符的位置送指定存储单元中,否则将0FFH送指定单元中。 ……

MOV BX,-1NEXT: INC BX CMP STRING[BX],20H LOOPE NEXT JNE OK;找到第一个非空格字符

MOVBL,0FFH JMPOK2OK: INCBLOK2:MOVINDEX,BL

……CX←字串个数BX←-1(取数计数)数为空格?(INDEX)←BLNBX←BX+1取数与20H比较Y开始结束CX←CX-1BL←BL+1CX=0?NBL←0FFHY2023/10/1080x86汇编语言程序设计3、LOOPNE/LOOPNZ指令指令格式:LOOPNE/LOOPNZTARGET执行功能:CX-1→CX;若CX≠0且ZF=0时,转到TARGET所指的指令(继续循环),若CX=0或ZF=1时,顺序执行。例:设一字节数组ARRAY,对其中每一数用0FH除,用余数组成数组TUSHU。若余数为0或数组取完时,停止,并把余数个数存入LEN。

……

MOV DL,0FHNO_ZERO:MOV AL,ARRAY[BX] XOR AH,AH DIVDL MOVYUSHU[BX],AH INCBX CMPAH,0 LOOPNENO_ZERO MOVLEN,BX

……CX←字串个数BX←0(取数计数)余数为0?(LEN)←BXNYUSHU←余数取数与0FH相除Y开始结束CX←CX-1BX←BX+1CX=0?NY2023/10/1080x86汇编语言程序设计4、JCXZ指令指令格式:JCXZTARGET执行功能:测试CX值,若CX=0,转到目标处(继续循环),否则,顺序执行。(三)、循环控制方法(计数法、条件法)例:统计某数组中相邻两数据间符号变化次数。

……

XOR BL,BLEXCHANG:MOV AL,[SI] XOR AL,[SI+1] TESTAL,80H JENEXT INCBLNEXT: INCSI LOOPEXCHANG MOVNUM,BLCX←数据个数SI←数组首址AL.7=1?NUM←BLNAL←(SI)BL←0,计数N开始结束CX←CX-1AL←AL⊕(SI+1)CX=0?YBL←BL+1SI←SI+1Y2023/10/1080x86汇编语言程序设计(四)、多重循环程序设计的特点1、设计方法和单重循环基本类似;2、各重循环的控制条件及其程序实现相互之间不能混淆;3、每次通过外层循环再次进入内层循环时,初始条件必须重新设置;

2023/10/1080x86汇编语言程序设计例:在存储区制作九九乘法表。

1*11*2 1*31*41*5…

MOVBH,0 MOVCX,9LOP1:PUSHCX INCBH MOVBL,0 MOVCX,9LOP2: INCBL MOVAL,BH MULBL MOV[DI],AL INCDI LOOPLOP2POPCXLOOPLOP1

……DI←存数据首址CX←9BH←0,BL←0(行,列)CX-1=0?POPCXNBH←BH+1,BL←0PUSHCX开始结束CX←9CX-1=0?NYAL←BL*BH(DI)←ALYDI←DI+1BL←BL+12023/10/1080x86汇编语言程序设计

BX1234例:把BX中的二进制数以十六进制的形式显示在屏幕上2023/10/1080x86汇编语言程序设计

……

movch,4rotate:movcl,4rolbx,clmoval,blandal,0fhaddal,30h;’0’~’9’ASCII30H~39Hcmpal,3ahjlprintitaddal,7h;’A’~’F’ASCII41H~46Hprintit:movdl,almovah,2int21hdecchjnzrotate

……2023/10/1080x86汇编语言程序设计

……movbx,0newchar:movah,1;键盘输入

int21hsubal,30hjlexit;<0退出

cmpal,9jgexit;>9退出

cbwxchgax,bxmovcx,10mulcxxchgax,bxaddbx,axjmpnewcharexit:……例:从键盘接收十进制数并存入BX((0×10)+1)×10+2)×10+51253132352023/10/1080x86汇编语言程序设计

……movbx,0newchar:movah,1;键盘输入

int21hsubal,30hjlexit;<0退出

cmpal,10jladd_tosubal,27h;‘a’~‘f’cmpal,0ahjlexit;<‘a’退出

cmpal,10hjgeexit;>’f’退出add_to:movcl,4shlbx,clmovah,0addbx,axjmpnewcharexit:……例:从键盘接收十六进制数并存入BX1af316166((0×16)+1)×16+0a)×16+0f2023/10/1080x86汇编语言程序设计xdw?array_headdw3,5,15,23,37,49,52,65,78,99array_enddw105ndw32例:将正数n

插入一个已排序的正数字数组……movax,nmovarray_head-2,0ffffhmovsi,0compare:cmparray_end[si],axjleinsertmovbx,array_end[si]movarray_end[si+2],bxsubsi,2jmpshortcompareinsert:movarray_end[si+2],ax……35152337495265789910532-1array_head

array_end

n

x

2023/10/1080x86汇编语言程序设计例:

将首地址为A的字数组从小到大排序(气泡算法,多重循环)

32,85,16,15,8

序号地址数比较遍数12341A322A+2853A+4164A+6155A+883216158851615832851581632858151632852023/10/1080x86汇编语言程序设计movcx,5;元素个数

deccx;比较遍数loop1:movdi,cx;比较次数

movbx,0loop2:movax,A[bx];相邻两数

cmpax,A[bx+2];比较

jlecontinuexchgax,A[bx+2];交换位置

movA[bx],axcontinue:addbx,2looploop2movcx,dilooploop12023/10/1080x86汇编语言程序设计例:有数组x(x1,x2,……,x10)和y(y1,y2,……,y10),

编程计算

z(z1,z2,……,z10)z1=x1+y1z2=x2+y2z3=x3-y3z4=x4-y4z5=x5-y5z6=x6+y6z7=x7-y7z8=x8-y8z9=x9+y9z10=x10+y10

逻辑尺:00110111001减法0加法2023/10/1080x86汇编语言程序设计xdwx1,x2,x3,x4,x5,x6,x7,x8,x9,x10ydwy1,y2,y3,y4,y5,y6,y7,y8,y9,y10zdwz1,z2,z3,z4,z5,z6,z7,z8,z9,z10logic_ruledw00dch;0000,0000,1101,1100

……

movbx,0movcx,10movdx,logic_rulenext:movax,x[bx]shrdx,1jcsubtractaddax,y[bx]jmpshortresult;向前引用subtract:subax,y[bx]result:movz[bx],axaddbx,2loopnext……2023/10/1080x86汇编语言程序设计datasegmentarraydw12,11,22,33,44,55,66,77,88,99,111,222,333numberdw55low_idxdw?high_idxdw?dataends例:折半查找算法2023/10/1080x86汇编语言程序设计121122334455667788991112223330123456789101112折半算法12023/10/1080x86汇编语言程序设计……leadi,arraymovax,number;要查找数

cmpax,[di+2];(ax)与第一个元素比较

jachk_lastleasi,[di+2]jeexit;(ax)=第一个元素,找到退出

stcjmpexit;(ax)<第一个元素,未找到退出chk_last:movsi,[di];元素个数

shlsi,1;计算最后一个元素

addsi,di;的地址

cmpax,[si];(ax)与最后一个元素比较

jbsearchjeexit;(ax)=最后一个元素,找到退出

stcjmpexit;(ax)>最后一个元素,未找到退出算法12023/10/1080x86汇编语言程序设计compare:cmpax,[bx+si]jeexitjahigher

deccxmovhigh_idx,cxjmpmidhigher:

inccxmovlow_idx,cxjmpmidno_match:stcexit:……search:movlow_idx,1movbx,[di];个数

movhigh_idx,bxmovbx,dimid:movcx,low_idxmovdx,high_idxcmpcx,dxjano_matchaddcx,dxshrcx,1movsi,cxshlsi,12023/10/1080x86汇编语言程序设计例:根据AL寄存器中哪一位为1(从低位到高位),把程序转移到8个不同的程序分支branch_tabledwroutine1dwroutine2dwroutine3dwroutine4dwroutine5dwroutine6dwroutine7dwroutine82023/10/1080x86汇编语言程序设计

……

cmpal,0;AL为逻辑尺

jecontinueleabx,branch_tableL:shral,1;逻辑右移

jncadd1jmpwordptr[bx]

;段内间接转移add1:addbx,typebranch_table;addbx,2jmpLcontinue:……routine1:……routine2:……

(寄存器间接寻址)2023/10/1080x86汇编语言程序设计(寄存器相对寻址)……cmpal,0jecontinuemovsi,0L:shral,1;逻辑右移

jncadd1jmpbranch_table[si];段内间接转移add1:addsi,typebranch_tablejmpLcontinue:……routine1:……routine2:……2023/10/1080x86汇编语言程序设计(基址变址寻址)

……

cmpal,0jecontinueleabx,branch_tablemovsi,7*typebranch_tablemovcx,8L:shlal,1;逻辑左移

jncsub1jmpwordptr[bx][si]

;段内间接转移sub1:subsi,typebranch_table;(si)-2loopLcontinue:……routine1:……routine2:……2023/10/1080x86汇编语言程序设计5.6串操作

5.6.1串操作指令及其用途2023/10/1080x86汇编语言程序设计(2)LODS(LoadString):串装入语法格式:

LODSB LODSW LODSD

功能描述:

AL/AX/EAX=DS:[SI]; if(DF=0)then SI=SI+size; else SI=SI–size; endif

其中,size=1(B)、2(W)或4(D)。也就是说,LODS(B/W/D)将DS:SI所指源串的1个元素(字节/字/双字)复制到AL/AX/EAX。然后,SI增加或减少1/2/4。若DF=0,则增加,否则减少。对标志位的影响:无。2023/10/1080x86汇编语言程序设计(3)STOS(StoreString):串存储语法格式:

STOSB STOSW STOSD

功能描述:

ES:[DI]=AL/AX/EAX; if(DF=0)then DI=DI+size; elseDI=DI–size; endif

其中,size=1(B)、2(W)或4(D)。也就是说,STOS(B/W/D)将AL/AX/EAX的值复制到ES:DI所指的内存单元。然后,DI增加或减少1/2/4。若DF=0,则增加,否则减少。对标志位的影响:无。2023/10/1080x86汇编语言程序设计(4)CMPS(CompareStrings):串比较

语法格式:

CMPSB CMPSW CMPSD

功能描述:

DS:[SI]–ES:[DI

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论