




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第四章汇编语言程序设计
顺序程序设计分支程序设计循环程序设计子程序软中断和BIOS调用1.设计步骤:根据实际问题抽象出数学模型确定算法画程序流程图分配内存工作单元和寄存器程序编码调试2.绘制程序流程图(1)用方框表示工作框(2)用菱形框表示判断框
NY?(4)各框之间用直线连起来表示程序走向。(3)用
框表示调用子程序或过程。3.源程序的基本结构:顺序、分支、循环、子程序程序流程图符号起始:功能:判断:子过程:顺序程序设计,又叫直接程序设计。它是相对于分支程序和循环程序设计而言的。因此,可以说顺序程序是既不包含分支,又不包含循环的程序,顺序程序是从第一条指令开始,按其自然顺序,一条指令一条指令地执行,在运行期间,CPU既不跳过某些指令,也不重复执行某些指令,一直执行到最后一条指令为止。4.1顺序结构程序例:将某段中的字符串“Hello!”传送到另一段中(内存数据块的传送)。开始建立传送方向DS:SI←
源串首地址
ES:DI
←目的串首地址CX
←
串长度串传送返回DOS4.1顺序结构程序(顺序执行,无转移、无循环)aa SEGMENT;数据段1xx DB'Hello!’;定义源串aa ENDSbb SEGMENT;数据段2yy DB6dup(?);定义目的串bb ENDScc SEGMENT;代码段 ASSUMECS:cc,DS:aa,ES:bb;分配段寄存器start
: CLD;设置传送方向 MOVAX,aa;DS:SI←源串首地址 MOVDS,AX
LEASI,xx
MOVAX,yy;ES:DI←目的串首地址 MOVES,AX MOVDI,OFFSETyy
MOVCX,6;CX←串的长度 REPMOVSB;串传送
MOVAH,4CH;调用4CH系统功能,返回DOS INT21Hcc ENDS
ENDstart
;程序结束
4.1顺序程序设计
例4.1.1把在字节存储单元AA和BB中的两个压缩BCD数相加,结果存到字节单元CC中。分析:实现BCD码相加,要通过二进制数加法指令实现。然后再用十进制调整指令进行调整,以获得正确的BCD结果。因为是单字节相加,只用一条二进制加法指令即可。如果考虑相加结果有进位,则可以将表示进位的CF标志位存入单元CC+1中。为此,在存储单元CC处留有两个字节,用来存放相加的结果。程序:DATASEGMENTAADB23H;被加数BBDB18H;加数CCDB2DUP(?);结果单元DATAENDSBCDADDSEGMENTASSUMECS:BCDADD,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVAL,AA;取被加数ADDAL,BB;二数相加DAA;调整为十进制结果MOVCC,ALLAHF;取标志位ANDAH,01;取CF位MOVCC+1,AH;存进位到C+1单元MOVAH,4CHINT21HBCDADDENDSENDSTART
例4.1.4在内存地址SQREA起有0~15的平方数表。在ABB单元任给---个小于等于15的整数,求其平方值。分析:因为平方表已顺序排放在内存中。又已知首地址为SQREA,只要把给定单元的内容作位移量与表首址相加,就指向了表中要求值的地址,取其内容即为该数的平方值。源程序:DATA SEGMENTSQREADB0,1,4,9,16,25,36,49,64,81DB100,121,144,169,196,225ABBDB8DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTARTPROC FARPUSHDSMOVAX,0PUSHAXMOVAX,DATAMOVDS,AXMOVBL,ABB;取给定单元中数MOVBH,0MOVSI,OFFSETSQREA;平方表首地址指针MOVAL,[SI+BX];取给定数的平方值MOVABB,AL;存回原单元RETFSTARTENDPCODEENDSENDSTART条件满足?处理P1处理P2标号1:标号2:NY1.简单分支结构4.2分支程序分支结构程序设计的关键在于准确地知道操作结果影响的标志位状态和正确地使用条件转移指令。根据对条件的判断而选择不同的处理方法是人的基本智能体现。2.多种分支结构标号1:条件1成立?P1NY条件2成立?条件n成立?…Pn+1标号2:标号n:标号n+1:P2PnNNYY
①用比较指令CMPDEST,SRCJEEQUL……EQUL:②用测试指令TESTDEST,SRCJNZNEXT……NEXT:③用逻辑指令
SHRDEST,CLJCNEXT……NEXT:例:编程实现下列函数的功能,其中X、Y为无符号字节数。(AL)=X(BL)=Y开始(AL)=(BL)?Z=0YZ=1Y(AL)>(BL)?NZ=-1N结束程序;--数据段定义----------------------------------
DAT
SEGMENT X DB 242 Y DB 67 Z DB ?
DAT
ENDS;--代码段定义----------------------------------
COD SEGMENT ASSUMEDS:DAT,CS:COD START:MOVAX,DAT
MOVDS,AX
;初始化DS
MOVAL,X MOVBL,Y;-------------------------------------------------------------------------------- CMP AL,BL
JE
C1
;(AL)=(BL)则跳转至C1
JA
C2
;(AL)>(BL)则跳转至C2 MOV AL,-1
JMPEXT
C1: MOV AL,0
JMP EXTC2: MOV AL,1EXT:MOVZ,ALMOV AH,4CH INT21H ;返回DOS;------------------------------------------------------------------------------------ COD ENDS
END START
4.2
分支程序设计例4.2.1设在A、B两个存贮单元各有一个无符号数,比较两个无符号数的大小,并根据判断结果,在屏幕显示A>B或B>A或A=B。分析:两个无符号数比较大小,使用比较指令CMP,产生标志位,然后根据标志位,使用无符号条件转移指令实现转移。源程序:DATASEGMENTADB3BHBDB8EHASTRDB‘A>B$’BSTRDB‘B>A$’CSTRDB‘A=B$’DATAENDS
CODESEGMENTASSUMECS:CODE,DS:DATAMOVAX,DATAMOVDS,AXMOVAL,A;取A中数CMPB,AL;A与B比较JAEBGA;B≥A,转BGAMOVDX,OFFSETASTR;显示A>BMOVAH,9INT21HJMPCOMBGA:JZAEBMOVDX,OFFSETBSTR;显示B>AMOVAH,9INT21HJMPCOMAEB:MOVDX,OFFSETCSTR;显示A=BMOVAH,9INT21HCOM:MOVAH,4CHINT21HCODEENDS
例4.2.2在一个字符串中,找出其ASCII码值最大的字符,并显示在屏幕上。分析:可以把每个字符的ASCII码,看做是一个无符号数。这样,就转化为在一组数中查找一个最大数的操作。通常使用逐个比较法,即把第一个数作比较标准,与其后的数比较。如标准数大,则再与下一个数比较。如标准数小,则将大数做为新的标准数,再与下一个数比较。依此类推,逐个比较,直到最后一个标准的数,就是要找的最大数,即值为最大的字符。源程序:DATASEGMENTBLOKDB‘Searchacharactertohave';字符串DB‘thelargestvalue$'COUNTEQU$-BLOK;串长DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVSI,OFFSETBLOKMOVCX,COUNT-1MOVAL,[SI];取一个字符,INCSI;调整指针COMP:CMPAL,[SI];字符比较JANEXT;若AL值大,转NEXT
MOVAL,[SI];否则,取大值到ALNEXT:INCSI;调整指针LOOPCOMP;循环查找MOVDL,AL;显示所找到的最大字符MOVAH,2INT21HMOVAH,4CHINT21HCODEENDSENDSTART循环程序的组成:循环程序是在满足某些条件时对一段程序的重复执行,一般由四部分组成。
4.3循环程序(1)循环初值部分:这是为了保证循环程序能正常进行循环操作而必须做的准备工作。循环初值分两类:一类是循环工作部分的初值,别一类是控制循环结束条件的初值。(2)工作部分:即需要重复执行的程序段。这是循环的中心,称之为循环体。(3)修改部分:按一定规律修改操作数地址及控制变量,以便每次执行循环体时得到新的数据。(4)控制部分:用来保证循环程序按规定的次数或特写条件正常循环。循环体循环控制继续循环?初始化YN(2)先判断后执行循环体可能一次都不执行初始化循环体循环控制继续循环?YN2.基本结构形式(1)先执行后判断(do—while)至少执行一次循环体
①MOVCX,COUNTAGAIN:……LOOPAGAIN②MOVCX,COUNTAGAIN:……DECCXJNZAGAIN③MOVCX,COUNTAGAIN:JCXZNEXT……DECCXJMPAGAINNEXT:2、循环程序设计(1)循环的控制方法下面介绍最常见的两种控制方法:计数控制和条件控制。①计数控制当循环次数已知时,通常使用计数控制法。假设循环次数为n,常常用以下三种方法实现计数控制和条件控制先将循环次数n送入循环体计数器中,然后,每循环一次,计数器减1,直至循环计数器中的内容为0时结束循环。如:MOVCX,n…;循环初值部分LOOPA:…;工作部分…;修改部分DECCX;控制部分JNZLOOPA:其中工作部分、修改部分被重复执行n次,即当(CX)=n,n-1,…,1时,重复执行循环体,当(CX)=0时,结束循环。先将循环次数的负值送入循环计数器中,然后每循环一次,计数器加1,直至计数器中的内容为零时结束循环。例如:MOVCX,-n…;循环初值部分LOOPA:…;工作部分…;修改部分INCCX;控制部分JNZLOOPA其中工作部分、修改部分被重复执行n次,即当(CX)=-n,-(n-1),…,-1时重复执行,当(CX)=0时结束循环。先将0送入循环计数器中,然后每循环一次,计数器加1,直到循环计数器的内容与循环次数n相等时退出循环。例如:MOVCX,0…;循环初值部分LOOPA:…;工作部分…;修改部分INCCX;修改部分CMPCX,nJNELOOPA其中工作部分、修改部分重复执行n次,即当(CX)=0,1,…,n-1时重复执行,当(CX)=n时结束循环。②条件控制有些情况下,循环次数事先无法确定,但它与问题的某些条件有关。这些条件可以通过指令来测试。若测试比较的结果表明满足循环条件,则继续循环,否则结束循环。
[例]:统计AX寄存器中1的个数,并将结果存放在CL寄存器中。…MOVCL,0L:ANDAX,AXJZEXITSALAX,1;将AX中的最高位移入CF中JNCL;如果CF=0,转LINCCL;如果CF=1,则(CL)+1→CLJMPL;转L处继续循环EXIT:…2、单重循环程序设计所谓单重循环指循环体内不再包含循环结构。下面分循环次数已知和未知两种情况讨论其程序设计方法。(1)循环次数已知的循环程序设计对于循环次数已知的情况,通常采用计数控制方法来实现循环。(2)最大循环次数未知的循程序设计对于循环次数未知的情况,常用条件来控制循环。3、多重循环程序设计多重循环即循环体内套有循环。设计多重循环程序时,可以从外层循环到内层循环一层一层地进行。
4.3循环程序设计例4.3.1在BUFFER开始的地址处,有一组有符号数。要求统计其中负数的个数。程序:DATASEGMENTBUFFERDB2,-3,18,-24,87,-98NEQU$-BUFFERRESLTDB?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTARTPROC FARPUSHDSXORAX,AXPUSHAXMOVAX,DATAMOVDS,AXMOVBX,OFFSETBUFFERMOVCX,NMOVDL,0LOP:MOVAL,[BX]ANDAL,ALJNSNEXTINCDLNEXT:INCBXLOOPLOPMOVRESLT,DLADDDL,30HMOVAH,2INT21HRETSTARTENDPCODEENDSENDSTART例4.3.2 在地址ADDR开始处,存放有100个无序的无符号数。要求按降序排列(大数在前、小数在后),结果仍存放到原地址区。分析:在前面的例子中,已讨论过求最大值的问题,现在要求是在找到最大值后再找次大数,且置于最大数后,以此类推,直到将所有的数都按降序排列完为止。所以,这是一个重复寻找最大数问题。每找一个最大数,要逐个与数列比较,将其作为内循环处理。当找到一个最大数后,还要在数列中找下一个次大的数,要重复使用循环程序,用控制重复执行内循环的程序部分作为外循环程序,这是一个二重循环程序。
源程序:DATASEGMENTADDRDB4AH,63H,27H,48H,22H,39H,…DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTARTPROCFARPUSHDSXORAX,AXPUSHAXMOVAX,DATAMOVDS,AXMOVCX,100-1;置计数器初值MOVSI,OFFSETADDR;取数据序列首指针LP1:MOVDX,CX;置内循环计数器MOVDI,SI;置内循环地址指针MOVAL,[DI];取数
LP2:INCDI;指向下一个数地址CMPAL,[DI];判大小JAENEXT;AL大,转NEXTMOVBL,AL;否则,交换数据MOVAL,[DI]MOV[DI],BLNEXT:DECDX;本遍比较完?JNZLP2;未完,转LP2MOV[SI],AL;完,存最大数INCSI;调整外循环地址指针LOOPLP1;未排完队列,转LP1RET;排完,返回CODEENDSENDSTART子程序:重复使用的程序段或具有通用性便于共享的程序段1.调用子程序用CALL指令,返回调用程序用RET指令2.现场的保护和恢复现场:指转向子程序执行时主程序的状态,包括当时标志寄存器、段寄存器、通用寄存器的内容主程序和子程序的设计是分开进行的,为保证主、子程序所使用的寄存器不会发生冲突,进入子程序时要保护主程序的运行状态和使用的寄存器内容(保护现场),退出子程序前要恢复现场。现场的保护和恢复分别用PUSH和POP指令实现4.4子程序设计
调用前要预先确定子程序中要使用哪些寄存器,并定义入口参数和出口参数。参数传递的方法:(1)使用约定的寄存器传递(2)使用约定的存储单元传递(3)使用堆栈传递(要用BP寻址)4.4子程序例4.4.2对存于ADD1地址起的20个非压缩的十进制数,要求用十进制数转ASCII码的子程序完成代码转换,并存于ADD2地址起的单元中,转换后的字符在屏幕上进行显示。十进制数转ASCII码子程序使用段间调用。源程序:NAMESUBPROGEXTRNADD1:BYTECODE2SEGMENTPARAPUBLIC‘CODE’SPRGPROCFARASSUMECS:CODE2PUBLICSPRGSTT:MOVAL,ADD1[SI]ADDAL,30HRETSPRGENDPCODE2ENDSENDNAMEEXDATASEGMENTADD1DB04H,05H,06H,02H,07H,05H,02H,03H,05H,08HDB08H,07H,09H,04H,09H,08H,05H,06H,07H,06HADD2DB20DUP(?)ADD3EQU20DATAENDSSTACKSEGMENTPARASTACK‘STACK’DW100DUP(?)STACKENDSPUBLICADD1EXTRNSPRG:FARCODE1SEGMENTPARAPUBLIC‘CODE’ASSUMECS:CODE1,DS:DATA,SS:STACKSTART:MOVAX,DATAMOVDS,AXMOVDI,0MOVSI,0MOVCX,ADD3LP:CALLSPRG;段间调用MOVADD2[DI],ALINCDIINCSI
MOVDL,ALMOVAH,02INT21HMOVDL,‘’INT21HLOOPLPMOVAH,4CHINT21HCODE1ENDSENDSTART4.4.4调用程序和子程序间的参数传递一、子程序说明文件子程序说明文件主要信息:(1)子程序的名称及其功能;(2)子程序的入口参数说明;(3)子程序的出口参数说明;(4)子程序所使用的寄存器及存储区;(5)子程序调用其它子程序的方式及名称。二、主程序和子程序之间的参数传递方式1.利用寄存器传递参数2.利用存储器传递参数
3.利用堆栈传递参数
利用存储器传递参数举例例4.4.4在ABCD地址起有N位带符号十进制数,其首字符表示为符号(用全0、全1码分别表示正和负)。数的高位在低地址,低位在高地址,将其转为对应的二进制数(负数用补码表示),并存于ABIN起的地址单元中,限定十进制数在士65535范围之中。
分析:为实现N位带符号的十进制数转换为二进制数,将十进制数表示为下式:d0、d1、d2、d3、d4、…d(n-1),其中d0为符号位。考虑相邻位数权值相差10倍,则该十进制数的二进制数值可用下式表示:(…((d1*1O+d2)*1O+d3)*10+…)*10+d(n-1)若符号位为正,则该值即为二进制正数值。若符号位为负,则应将该数转为负数的补码。为了实现存储器参数传递,由SI作十进制数地址指针,DI作二进制数地址指针,CX指示十进制数位长。子程序返回参数由AX提供,AX=0,表示十进制数有错或结果溢出。AX≠0,表示其内容为正确的二进制数结果。
源程序:STACKSEGMENTPARASTACK‘STACK’DB200DUP(?)STACKENDSDATASEGMENTABCDDB0,0,0,3,4,5ABINDB3DUP(O)NEQU6DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATAASSUMESS:STACKSTART:MOVAX,DATAMOVDS,AXLEASI,ABCD;置数据地址指针(含符号位)LEADI,ABIN;置结果数据地址指针(含符号位)MOVCX,N-1;置计数器初值CALLDTOB;调用DTOB子程序CMPAX,O;返回码表错?JNEFIN;无错,转FINMOVDL,‘0’;显示‘0’,表示结果有错。MOVAH,02HINT21HFIN:MOVAH,4CHINT21HCODEENDS
;子程序名:DTOB;功能:把由SI指出的存储单元中的有符号十进制数转换为二进制数,结果存于AX寄存器中。;入口参数:SI指向十进制数(非压缩BCD数)首址;DI指向二进制数存储区首址;CX=十进制数位长(含符号位);出口参数:AX=返回码,AX=0,十进制数有错或结果溢出;AX≠0,AX中为转换后的二进制数。;使用寄存器:BX为存放各十进制数位运算值,DX存放乘积运算的高位值。DTOBPROCPUSHDX;保护寄存器PUSHBXMOVBL,[SI];取符号CMPBL,0JZPLUS;为正,转PLUSCMPBL,OFFH;为负吗?JNZEROR;非负非正转EROR处PLUS:MOV[DI],BL;存结果的符号DECCXINCSIMOVAL,[SI];取十进制数高位存AX中MOVAH,0MOVDX,10NEXT:PUSHDXMULDX;AX*10→AXPOPDXINCSIMOVBL,[SI];取低位十进制数MOVBH,0ADDAX,BX;AX加上低位数JCEROR;进位,转ERORLOOPNEXT;未处理完循环CMPBYTEPTR[DI],OFFH;判结果符号JNZDONE;非负数,结束NEGAX;负数,取补MOVWORDPTR[DI],AX;补码送回JMPDONEEROR:MOVAX,0;置错误返回码DONE:POPBXPOPDXRETDTOBENDPCODEENDSENDSTART利用堆栈传递参数举例例4.4.5NUMB开始的地址处,有5个压缩型BCD码,将它们相加,其和在屏幕上显示。源程序:STACKSEGMENTPARASTACK'STACK'DW50DUP(?)TOPLABELWORDSTACKENDSDATASEGMENTNUMBDB25H,36H,78H,49H,07HNOUTDB5DUP(?)NEQU5DATAENDS
EXTRNADDS:FARDISMACROXMOVDL,XORDL,30HMOVAH,02INT21HENDMMCODESEGMENTPARAPUBLIC'CODE'ASSUMECS:MCODE,DS:DATA,SS:STACKSTART:MOVAX,DATAMOVDS,AXMOVAX,STACKMOVSS,AXMOVSP,OFFSETTOPMOVAX,OFFSETNUMBPUSHAXMOVAX,NPUSHAXCALLADDSCALLDISPMOVAH,4CHINT21HDISPPROCMOVBX,AX;存累加和MOVCL,4SHRAH,CL;右移叫工DISAH;显示高位值MOVAH,BHANDAH,OFH;取低位数DISAH;显示低位数SHRAL,CLDISALMOVAL,BLANDAL,0FHDISALRETDISPENDPMCODEENDSENDSTARTNAMEADDSRSCODESEGMENTPARAPUBLIC‘CODE’ASSUMECS:SCODEADDSPROCFARPUBLICADDSPUSHBPMOVBP,SPPUSHCXPUSHBXMOVCX,[BP+6];取数据项数NMOVBX,[BP+8];取数据首地址MOVAX,0ADER:ADDAL,[BX]DAAADCAH,0INCBXLOOPADERPOPBXPOPCXPOPBPRET4;退回到本例使用前的栈顶ADDSENDPSCODEENDSEND
4.5软中断和BIOS调用
4.5.18088/8086的中断系统一、8088/8086的中断源
软中断
软中断指令格式:INTn
n为中断类型号,n=0~256。0~7中断类型号做为内部中断不可屏蔽中断的类型号。8~0FH做为外部硬中断。内部中断(1)除法溢出中断(2)溢出中断(3)单步中断二、中断矢量表
1.中断矢量表结构与功能中断矢量表存256个中断处理程序入口地址的表,共占用1024个字节,位于物理(0段)地址OOO0OH-003FFH。每个入口地址占四个字节,高两个字节存放中断处理程序的段地址,低两个字节存放中断处理程序的段内偏移量。4.5.2软中断程序设计及执行过程
一、用户软中断设置的内容1.确定一个允许用户使用的中断类型号n。2.编写软中断的处理程序,明确其入口参数及出口参数的规定。3.将中断处理程序入口地址写入中断矢量表。二、中断处理程序的结构
1.保护现场2.中断处理程序的主要内容3.恢复现场4.中断返回
中断处理程序的一般结构:INTPRGPROC[FAR/NEAR]STI;开中断,适合嵌套方式PUSHDS;保护现场PUSHDXPUSHAXPUSHBXPUSHDI┇┇;中断处理指令序列(略)POPDI;恢复现场POPBXPOPAXPOPDXPOPDSIRET;中断返回INTPRGENDP
三、填写中断矢量表中断处理程序的入口地址,存放在中断矢量表中的4n地址处。DOS系统25H调用填写中断矢量表的方法:(1)AH=25H,AL=中断类型号n;(2)DS:DX=中断处理程序的入口地址(段地址:段内偏移量);(3)执行INT21H指令,即可将中断处理程序的入口地址写入中断矢量表。例:将中断处理程序的入口地址写入中断矢量表CODESEGMENTASSUMECS:CODEST:┇MOVAX,SEGINTP;取中断处理子程序段地址MOVDS,AXMOVAX,OFFSETINTP;取中断处理子程序偏移量MOVDX,AXMOVAL,n;置中断类型号MOVAH,25H;置DOS调用功能号INT21H┇INTPPROC;中断处理程序┇IRETINTPENDPCODEENDSENDST四、软中断执行过程CPU在执行完指令I
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 市场业务拓展合同范本
- 2025年度二手房置换合同规范文本
- 2025-2030年中国氧化铝精密陶瓷行业深度研究分析报告
- 2019-2025年中国植入人体支夹市场供需格局及未来发展趋势报告
- 2025年中碳猛铁行业深度研究分析报告
- 测绘产品质量检查报告
- 专题17 直线与圆小题综合(学生卷)- 2025年高考之近十年真题数学分项汇编
- 中国电站设备市场深度调研分析及投资前景研究预测报告
- Unit 1 You and Me Section A-pronunciation 英文教学设计2024-2025学年人教版英语七年级上册
- 中国湖南旅游行业市场调查研究及发展战略规划报告
- 2024年河南郑州二七区侯寨中心卫生院招聘笔试真题
- 中国糖尿病防治指南+2024+解读
- 岗位职责心得体会(2篇)
- 2025年上海宝冶集团限公司招聘历年高频重点提升(共500题)附带答案详解
- GB/T 6822-2024船体防污防锈漆体系
- 电信网络诈骗犯罪的特征、治理困境及对策建议
- 救护车挂靠私立医院协议书(2篇)
- 《血透患教》课件
- app 购买合同范例
- 高二上学期物理(理科)期末试题(含答案)
- 2024年房地产经纪人《房地产经纪专业基础》考前冲刺必会试题库300题(含详解)
评论
0/150
提交评论