请编制程序,其功能是:内存中连续存放着20个无符号字节数序列,请将它们排成升序(从小到大)。例如:内存中有01H,04H,02H…(假设后17个字节均大与04H)结果为 01H,02H,04H…(后跟17个字节,按从小到大的顺序排列)部分程序已给出,其中原始数据由过程LOAD从文件INPUT1.DAT中读入SOURCE开始的内存单元中。运算结果要求从RESULT开始存放,由过程SAVE保存到文件OUTPUT1.DAT中。请填空BEGIN和END之间已给出的源程序使其完整(空白已用横线标出,每个空白一般只需

题目

请编制程序,其功能是:内存中连续存放着20个无符号字节数序列,请将它们排成升序(从小到大)。

例如:

内存中有01H,04H,02H…(假设后17个字节均大与04H)

结果为 01H,02H,04H…(后跟17个字节,按从小到大的顺序排列)

部分程序已给出,其中原始数据由过程LOAD从文件INPUT1.DAT中读入SOURCE开始的内存单元中。运算结果要求从RESULT开始存放,由过程SAVE保存到文件OUTPUT1.DAT中。

请填空BEGIN和END之间已给出的源程序使其完整(空白已用横线标出,每个空白一般只需一条指令,但采用功能相当的多条指令亦可),或删除BEGIN和END之间原有的代码并白行编程来完成所要求的功能。

对程序必须进行汇编,并与IO.OBJ链接产生可执行文件,最终运行程序产生结果。调试中若发现整个程序中存在错误之处,请加以修改。

试题程序:


相似考题

2.请编制程序PROG1.ASM,其功能是:内存中连续存放着二个有符号字节序列Ak和Bk,求序列Ck(Ck=Ak+Bk)。例如:源数Ak:0lH,02H,02H,02H,04H,05H…源数Bk:01H,02H,02H,02H,04H,05H…结果Ck:02H,04H,04H,04H,08H,0AH…部分程序已经给出,其中原始数据由过程LOAD从文件INPUTl.DAT中读入SOURCE开始的内存元中,运算结果要求从RESULT开始存放,由过程SAVE保存到文件OUTPUT1.DAT中。请在BEGIN和END之间补充一段源程序,完成要求的功能。对程序必须进行汇编,并与IO.OBJ链接产生执行文件,最终运行程序产生结果。调试中若发现整个程序中存在错误之处,请加以修改。PROG1.ASM文件内容如下:EXTRN LOAD: FAR, SAVE: FARN EQU 10 ;每个序列的长度STAC SEGMENT STACKDB 128 UP(?)STAC ENDSDATA SEGMENTSOURCE DB N * 2DUP(?) ;顺序存放AO, ..., A9 ,BO,.. ,B9RESULT DW N DUP(0) ;顺序存放CO,...,C9NAME0 DB 'INPUT1. DAT',0NAME1 DB 'OUTPUT1. DAT' ,0DATA ENDSCODE SEGMENTASSUME CS: CODE, DS: DATA, SS: STACSTART PROC FARPUSH DSXOR AX, AXPUSH AXMOV AX, DATAMOV DS, AXLEA DX, SOURCE ;数据区起始地址LEA SI, NAME0 ;原始数据文件名MOV CX, N*2 ;字节数CALL LOAD ;从INPUT1.DAT文件中读取数据; * * * * BEGIN * * * *MOV DI,OFFSET RESULT ;结果从RESULT开始存放MOV BX,0MOV CX,NPRO: MOV AH ,0MOV AL,_____ ;序列Bk中的一个字节MOV DL, AL ; 暂存Bk_____ AL, SOURCE [BX] ; Ck = Bk + AkJNO STAY ; 无溢出转STAYJUMP1: MOV AH ,00 ; 有溢出ADD DL,OJNS JUMP ; Bk是正数(为一个正数加上; 一个正数,结果为负数的溢出; 情况)转JUMP(AH已为OOH)MOV AH,_____ ; Bk是负数(为一个负数加上&nbs

参考答案和解析
正确答案:(1)INC DI (2)NEXT0 (3)N-1 (4)SB (5)NEXT3 (6)AL (7)NEXT2 (8)BX (9)NEXT1
(1)INC DI (2)NEXT0 (3)N-1 (4)SB (5)NEXT3 (6)AL (7)NEXT2 (8)BX (9)NEXT1 解析:此程序是用冒泡排序法实现一个含20个无符号数的序列的升序排序的功能。冒泡排序方法为:将第一个数据与相邻的数进行比较,若次序不对,两数交换位置。依次类推,直至第N-1个数和第N个数进行过比较为止。上述过程称为第一趟冒泡排序。第一趟冒泡排序经过N-1次比较后,最大的数已经到了数组尾,第二趟仅需比较N-2次比较就够了,一共比较N-1趟就完成了排序。这样共有两重循环:CX是内循环次数,而BX是外循环次数。
程序的堆栈段定义了一个128字节的堆栈区.堆栈段下面是数据段.数据段中定义了四个字节型变量:原始数据区SOURCE、结果数据区RESULT、原始数据文件名NAME0、结果数据文件名NAMEI。数据段下面是代码段,告诉汇编程序,代码段。数据段和堆栈段分别属于段寄存器CS、DS,SS。
先将原始数据的偏移地址装入到SI中,结果数据存放的偏移地址装入到DI中。CX赋初值为N,用于控制循环处理的次数。
NEXT0段,将SI中内容送AL,再将AL存入到DI中。然后SI地址加1,DI地址加1。所以第(1)空填写"INC DI"。继续取数据AL,存数据,从入口处NEXT0循环。所以第(2)空填写"NEXT0"。CLD指令是将方向标志DF清0,在数据操作时,实现地址指针自动增量。第(3)空是给BX赋初值N-1。因为外循环需要比较N-1趟。
NEXT1段,将结果数据地址装入到SI中,BC赋值给CX。
NEXT2段,是开始做一趟内的比较。第(4)空是考查LODSB指令,是将SI作为地址指针中的数据装入到AI中,同时修改SI,SI地址加1,指向下一个元素。将AL与下一元素[SI]做比较,若[SI]大于等于AL,则转向NEXT3;否则,将AL与[SI]交换。第(5)、(6)空分别填写"NEXT3","AL"。AL与[SI]交换后,再将送[SI-1)中。
NEXT3段,当完成一趟内的相邻两个数的比较后,从NEXT2入口处循环,在该趟内,将AL继续与其他数的比较。所以第(7)空填写"NEXT2"。每次完成一趟比较,BX应减1,若BX不为0,则继续进行外循环,进行第二趟比较,循环入口处是NEXT1。所以第(8)空和第(9)空分别填写"BX","NEXT1"。
更多“ 请编制程序,其功能是:内存中连续存放着20个无符号字节数序列,请将它们排成升序(从小到大)。例如:内存中有01H,04H,02H…(假设后17个字节均大与04H)结果为 01H,02H,04H…(后跟17个字节,”相关问题
  • 第1题:

    请编制程序,其功能是:在递增的有序字节数组中插入一个正整数,并按指定的数组个数存入内存区中。假设数组元素均为正数。

    例如,将02H插入下面的数组中:

    01H,03H,04H,05H…

    结果为 01H,02H,03H,04H,05H…

    部分程序已经给出,其中原始数据由过程LOAD从文件INPUT1.DAT中读入SOURCE开始的内存单元中,转换结果要求从RESULT开始存放,由过程SAVE保存到文件OUTPUT1.DAT中。

    请填空BEGIN和END之间已经给出的一段源程序使其完整,需填空处已经用横线标出,每个空白一般只需要填一条指令或指令的一部分(指令助记符或操作数),考生也可以填入功能相当的多条指令,或删去BEGIN和END之间原有的代码并自行编程来完成所要求的功能。对程序必须进行汇编,并与IO.OBJ链接产生可执行文件,最终运行程序产生结果。调试中若发现整个程序中存在错误之处,请加以修改。

    试题程序:


    正确答案:(1)AL (2)DL (3)SI (4)[BX+SI+1] (5)REP
    (1)AL (2)DL (3)SI (4)[BX+SI+1] (5)REP 解析:此程序要实现的功能是:在递增的有序字节数组中插入一个正整数,并按指定的数组个数存入内存区中。
    此程序是用直接插入法将关键字插入到一个数组中,插入前数组的长度为9,插入关键字后,数组长度为10。关键要理解:是将关键字和数组的最后一个数开始比较,然后再与倒数第二个、倒数第三个……逐个比较,直到找到了合适的插入位置为止。
    程序的数据段中定义了五个字节型变量:变量MIN、原始数据区SOURCE、结果数据区 RESULT、原始数据文件名NAME0、结果数据文件名NAME1。数据段下面是堆栈段,定义了一个256个字节的堆栈区。最后是代码段,告诉汇编程序,代码段、数据段和堆栈段分别属于段寄存器CS、DS、SS。假设要插入的数是X即2。
    先将原始数据的偏移地址装入到BX中,SI赋值为N-2即日,将偏移地址BX加上SI,则得到偏移地址BX为8,接着将SI赋值为0,将要插入的数X送AX。
    LP段,先将AL即X与数组的最后一个数(第9个数)即BX+SI中的内容做比较,若AL大于等于第9个数,则转向1NS处执行;否则,AL小于最后第9个数,则将第9个数即BX+SI中的内容赋给DL,再将DL存入到数组的最后一个位置即第10个数存放的地址中,它的偏移地址为BX+SI+I,这样数组中原第9个数就存入到了数组的第十个位置了,成为该数组的最后一个数。然后,将SI减1,无条件转向 LP处执行,继续将AL与原数组的倒数第二个数即偏移地址为BX+SI-1内容中的数相比较,比较后,再做不同的处理。从上面的分析来看,第(1)空填写"AL",第(2)空填写"DL",第(3)空填写"SI"。INS段,是当AL大于等于第9个数时,则将AL即要插入的数X存入到数组的第十个位置上。如果 AL不是与第9个数比较,而是与中间的某一个数如第六个数相比,AL大于第六个数,则将要插入的数 AL存放到数组的第七个位置上。其他情况依次类推。所以第(4)空填写"[BX+SI+1]"。接着,用CLD指令将方向标志DF清0,在存储数组中的数据时,实现地址指针自动增量。将原始数据的偏移地址装入到SI中,结果数据存放的偏移地址装入到DI中。CX赋值为N,用于控制存储数组中数据的次数。再用 REP MOVSB指令将SI指定的存储单元中的内容即数组中的10个数据装入到DI指定的内存中。一共操作10次,就将10个数据都存储完毕了。所以第(5)空填写"REP"。

  • 第2题:

    请编制程序,其功能是:内存中连续存放着两个无符号字节数序列Ak和Bk (k=0,1,…,9),求序列Ck,Ck=Ak÷Bk (运算结果按序以字的形式连续存放,其中低字节为商,高字节为余数)。

    例如:

    序列Ak为:01H,7FH, 80H,FFH…

    序列Bk为:PFH,80H,7FH,01H…

    结果Ck为:0100H(00H为商、01H为余数),7F00H,0101H,00FFH…

    部分程序已给出,其中原始数据由过程LOAD从文件INPUT.DAT中读入SOURCE开始的内存单元中,运算结果要求从 RESULT开始存放,由过程SAVE保存到文件OUTPUT.DAT中。

    请填空BEGIN和END之间已给出的源程序使其完整,空白已用横线标出,每个空白一般只需一条指令,但采用功能相当的多条指令亦可,或删除BEGm和END之间原有的代码并自行编程来完成所要求的功能。

    对程序必须进行汇编,并与IO.OBJ链接产生可执行文件,最终运行程序产生结果。调试中若发现整个程序中存在错误之处,请加以修改。

    [试题程序]

    EXTRN LOAD:FAR,SAVE:FAR

    N EQU 10

    STAC SEGMENT STACK

    DB 128 DUP(?)

    STAC ENDS

    DATA SEGMENT

    SOURCE DB N*2 DUP(?)

    RESULT DW N DUP(0)

    NAME0 DB 'INPUT.DAT',0

    NAME1 DB 'OUTPUT.DAT',0

    DATA ENDS

    CODE SEGMENT

    ASSUME CS:CODE, DS:DATA, SS:STAC

    START PROC FAR

    PUSH DS

    XOR AX,AX

    PUSH AX

    MOV AX,DATA

    MOV DS,AX

    LEA DX,SOURCE ;数据区起始地址

    LEA SI,NAME0 ;原始数据文件名

    MOV CX,N*2 ;字节数

    CALL LOAD ;从 'INPUT.DAT' 中读取数据

    ; ******** BEGIN ********

    MOV DI,OFFSET RESULT

    MOV BX,0

    (1)

    PRO: MOV (2)

    (3) ,SOURCE[BX]

    CBW

    DIV (4)

    MOV [DI], (5)

    ADD DI,2

    (6)

    DEC CX

    (7) PRO

    ; ******** END ********

    LEA DX,RESULT ;结果数据区首址

    LEA SI,NAME1 ;结果文件名

    MOV CX,2*N ;结果字节数

    CALL SAVE ;保存结果到文件

    RET

    START ENDP

    CODE ENDS

    END START


    正确答案:(1)MOV CXN (2)DLSOURCE[BX+N] (3)MOV AL(4)DL (5)AX (6)INC BX (7)JNZ
    (1)MOV CX,N (2)DL,SOURCE[BX+N] (3)MOV AL(4)DL (5)AX (6)INC BX (7)JNZ 解析:本题是一道序列计算题,其中关键问题在于找出序列的范围,确定序列中的数据类型,最后选择计算方法。其中序列范围在题目中已明确给出,每个序列的长度是10个字节数,两个序列连续存放,总共20个字节数,占20个存储单元。题目中明确指出序列A和序列B均为无符号字节数,运算结果按序以字的形式连续存放,所以在计算运算结果的偏移位置时要特别注意。题目要求的是两个序列相除,然后将运算结果存为字数据,低字节为商,高字节为余数。

  • 第3题:

    3.假设x86实模式下,物理地址中存放的数据如下:(13000H)=01H,(13001H)=02H,(13002H)=04H,以下说法错误的是()

    A.每个地址可以访问的存储单元长度为1个字节。

    B.从地址13000H开始,连续读取两个字节,可以构成一个对准字,这个字为0201H

    C.从地址13001H开始,连续读取两个字节,将构成一个非对准字,这个字为0204H

    D.访问任何一个地址,可以读取一个字节。


  • 第4题:

    请编制程序PROG1.ASM,其功能是:内存中连续存放着由20个无符号字节组成的一个序列,请将它们排成升序(从小到大)。

    程序中,COUNT为序列元素个数,OFFL为序列偏移量,BX为交换标志寄存器(BX =1,说明此趟排序扫描后未发生交换操作,表示序列中的元素已排好序)。

    例如:内存中有01H,04H,02H,…(假设后十七个字节均大于04H)

    结果为01H,02H,04H,…(后跟十七个字节,按从小到大的顺序排列)

    部分程序已给出,其中原始数据由过程LOAD从文件INPUT1.DAT中读入SOURCE开始的内存单元中。运算结果要求从RESULT开始存放,由过程SAVE保存到文件OUT- PUT1.DAT中。请编写BEGIM到END之间代码。对程序必须进行汇编,并与IO.OBJ连接产生PROG1.EXE执行文件,最终运行程序产生结果(无结果或结果不正确者均不得分);

    部分源程序如下:

    EXTRN LOAD:FAR,SAVE:FAR

    N EQU 20

    STAC SEGMENT STACK

    DB 128 DUP (?)

    STAC ENDS

    DATA SEGMENT

    SOURCE DB N DUP (?)

    RESULT DB N DUP (0)

    NAME0 DB 'INPUT1. DAT', 0

    NAME1 DB 'OUTPUT1. DAT', 0

    COUNT DW ?

    OFFL DW ?

    DATA ENDS

    CODE SEGMENT

    ASSUME CS:CODE, DS:DATA, SS:STAC

    START PROC FAR

    PUSH DS

    XOR AX,AX

    PUSH AX

    MOV AX,DATA

    MOV DS, AX

    LEA DX, SOURCE ; 数据区起始地址

    LEA SI,NAMEO ; 原始数据文件名

    MOV CX,N ; 字节数

    CALL LOAD ; 从'INPUT1.DAT'中读取数据

    **** BEGIN ****

    ***** END *****

    LEA DX,RESULT ; 结果数据区首地址

    LEA SI,NAME1 ; 结果文件名

    MOV CX,N ; 结果字节数

    CALL SAVE ; 保存结果到文件

    RET

    START ENDP

    CODE ENDS

    END START

    相关知识:

    ●无符号数比较大小。

    有符号数和无符号数比较大小采用的是不同的指令,本题目要求将无符号数进行排序,这里仅介绍无符号数的比较指令。

    (1)“高于”或“不低于等于”条件转移指令

    指令格式:JA/JNBE短标号地址

    (2)“高于等于”或“不低于”条件转移指令

    指令格式:JAE/JNB短标号地址

    (3)“等于”条件转移指令

    指令格式:JE 短标号地址

    (4)“不等于”条件转移指令

    指令格式:JNE 短标号地址

    (5)“低于等于”或“不高于”条件转移指令

    指令格式:JBE/JNA 短标号地址

    (6)“低于”或“不高于等于”条件转移指令

    指令格式:JB/JNAE 短标号地址

    ●数组的排序

    数组的排序的方法有很多种,可以采用“冒泡排序”、“直接插入排序”、“简单选择排序”等算法复杂度为O(n(上标)2)的简单排序算法,也可采用那些算法复杂度为O(nlog(下标)2n)或O(d (n+rd))的算法,但简单排序算法比较容易理解,编程比较方便。通过阅读我们发现出题者的意愿就是采用冒泡排序方法,因为它要多次扫描数组,而且有一个标志指明一趟扫描是否发生数据交换,这是典型冒泡排序方法。当然大家也可采用别的排序算法,作为题目的分析者我们就不采用别的方法了。

    ●串的移动


    正确答案:LEA SISOURCE LEA DIRESULT MOV CXN NEXTO: MOV AL[SI] MOV [DI]AL INC SI INC DI LOOP NEXTO ; 将待排序数组移到目的单元 CLD LEA SI RESULT MOV CX N MOV OFFL SI MOV COUNT CX INIT: MOV BX 1 ; 一趟比较之前标志寄存器置 DEC COUNT JZ SORTED ; 如果进行n次扫描结束排序 MOV CX COUNT MOV SI OFFL NEXT: LODSB CMP [SI] AL ; 两两比较 JAE CONT XCHG [SI] AL MOV [SI-1] AL SUB BX BX ; 发生数据交换交换标志清零 CONT: LOOP NEXT CMP BXO JE INIT ; 如果有数据交换发生再进行一趟扫描 SORTED: NOP
    LEA SI,SOURCE LEA DI,RESULT MOV CX,N NEXTO: MOV AL,[SI] MOV [DI],AL INC SI INC DI LOOP NEXTO ; 将待排序数组移到目的单元 CLD LEA SI, RESULT MOV CX, N MOV OFFL, SI MOV COUNT, CX INIT: MOV BX, 1 ; 一趟比较之前,标志寄存器置 DEC COUNT JZ SORTED ; 如果进行n次扫描,结束排序 MOV CX, COUNT MOV SI, OFFL NEXT: LODSB CMP [SI] ,AL ; 两两比较 JAE CONT XCHG [SI], AL MOV [SI-1] ,AL SUB BX, BX ; 发生数据交换,交换标志清零 CONT: LOOP NEXT CMP BX,O JE INIT ; 如果有数据交换发生,再进行一趟扫描 SORTED: NOP

  • 第5题:

    若在8086CPU系统中,物理地址为00024H开始的连续存储单元内容依次如下:00H,01H,02H,03H,04H,05H,06H,07H,已知外中断类型号为0AH,则该中断服务程序的入口地址CS:IP是0706:0504H 。


    正确