请编制程序,其功能是:内存中连续存放着20个十六位二进制数,对每个数逻辑右移,使其最低位为"1"(值为零的字不变)。例如:内存中有A704H(1010011100000100B),0000H,9A58H…结果为 29C1H(0010100111000001B),0000H,134BH…部分程序已给出,其中原始数据由过程LOAD从文件INPUT1.DAT中读入SOURCE开始的内存单元中,运算结果要求从RESULT开始存放,由过程SAVE保存到文件OUTPUT1.DAT中。请填空BEGIN和END之间已给出

题目

请编制程序,其功能是:内存中连续存放着20个十六位二进制数,对每个数逻辑右移,使其最低位为"1"(值为零的字不变)。

例如:

内存中有A704H(1010011100000100B),0000H,9A58H…

结果为 29C1H(0010100111000001B),0000H,134BH…

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

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

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

试题程序:


相似考题

3.请编制程序,其功能是:内存中连续存放着10个十六位二进制数,每个数的序号依次定义为0,1,…,9。统计每个数中位为0的个数N0,N1,…,N9(均用一个字节表示),然后按序将N0至N9存入内存中,最后再用一个字节表示这10个数中为0的位的总数n(n=N0+N1+…+N9)。例如:内存中有:0000H,000FH,FFFFH…结果为: 10H,0CH,00H…最后为n部分程序已给出,其中原始数据由过程LOAD从文件INPUT.DAT中读入SOURCE开始的内存单元中。运算结果要求从 RESULT开始存放,由过程SAVE保存到文件OUTPUT.DAT中。请填空BEGIN和END之间已给出的源程序使其完整,空白己用横线标出,每个空白一般只需一条指令,但采用功能相当的多条指令亦可,或删除BEGIN和END之间原有的代码并自行编程来完成所要求的功能。对程序必须进行汇编,并与IO.OBJ链接产生可执行文件,最终运行程序产生结果。调试中若发现整个程序中存在错误之处,请加以修改。【试题程序】EXTRN LOAD:FAR,SAVE:FARN EQU 10STAC SEGMENT STACKDB 128 DUP (?)STAC ENDSDATA SEGMENTSOURCE DW N DUP(?)RESULT DB N+1 DUP(0)NAME0 DB 'INPUT.DAT',0NAME1 DB 'OUTPUT.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 ; 从'INPUT.DAT'中读取数据; ******** BEGIN ********MOV DI,OFFSET RESULTMOV CL,NMOV BX,0MOV DR,0PRO: MOV DL,0MOV AX, SOURCE[BX]MOV CH, (1)COUNT: (2)(3) JUMPINC DLJUMP: DEC CHJNZ (4)MOV [DI], DLADD DH,DLINC DIADD (5)DEC CLJNZ PROMOV (6); ******** END ********LEA DX,RESULT ; 结果数据区首址LEA SI,NAME1 ; 结果文件名MOV CX,N+1 ; 结果字节数CALL SAVE ; 保存结果到文件RETSTART ENDPCODE ENDSEND START

4.请编制程序,其功能是:内存中连续存放着10个十六位二进制数。分别对每个数的高位字节和低位字节进行逻辑与运算及逻辑或运算。运算结果以字的形式按序连续存放(低位字节存入逻辑与运算的结果,高位字节存入逻辑或运算的结果)。例如:内存中有:AA55H,55AAH,FFAAH结果为: PP00H,FF00H,FFAAH部分程序已给出,其中原始数据由过程LOAD从文件INPUT1.DAT中读入SOURCE开始的内存单元中。运算结果要求从 RESULT开始存放, 由过程SAVE保存到文件OUTPUT1.DAT中。请填空BEGIN和END之间已经给出的源程序使其完整,空白处已经用横线标出,每个空白一般只需一条指令,但采用功能相当的多条指令亦可,或删去BEGIN和END之间原有的代码并自行编程来完成所要求的功能。对程序必须进行汇编,并与IO.OBJ链接产生可执行文件,最终运行程序产生结果。调试中若发现整个程序中存在错误之处,请加以修改。[试题程序]EXTRN LOAD:FAR,SAVE:FARN EQU 3STAC SEGMENT STACKDB 128 DUP (?)STAC ENDSDATA SEGMENTSOURCE DW N DUP(?)RESULT DW N DUP(0)NAME0 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,NANE0 ;原始数据文件名MOV CX,N*2 ;字节数CALL LOAD ;从'INPUT1.DAT'中读取数据; ********* BEGIN **********MOV DI,OFFSET RESULTMOV CX,NMOV BX,00PRO: MOV AX, (1)MOV DX,AXAND (2) ,DH(3) AH,ALMOV (4) ,DLADD BX,2(5)ADD DI,2(6)JNZ PRO; ******** END ********LEA DX,RESULT ;结果数据区首址LEA SI,NAME1 ;结果文件名NOV CX,N*2 ;结果字节数CALL SAVE ;保存结果到文件RETSTART ENDPCODE ENDSEND START

更多“ 请编制程序,其功能是:内存中连续存放着20个十六位二进制数,对每个数逻辑右移,使其最低位为"1"(值为零的字不变)。例如:内存中有A704H(1010011100000100B),0000H,9A58H…结果为 ”相关问题
  • 第1题:

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

    例如:

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

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

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

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

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

    试题程序:


    正确答案:(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"。

  • 第2题:

    请编制程序,其功能是:内存中连续存放着20个无符号二进制字序列Xi(i=1,2,…,20),字的最高3位为000,此序列对应某一信号在一段时间内的连续变化,现对该信号进行一阶低通数字滤波,其滤波方程为:

    Yi=(15*Yi-1/16)+(Xi/16),Y0=0

    Yi(i=1,2…,20)为滤波后得到的新序列,结果存入内存。

    例如:

    内存中有01FFH,02FFH…

    结果 001H,004DH…

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

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

    试题程序:


    正确答案:BX (2)ADD (3)SUB (4)MOV BXAX (5)INC DI (6)INC SI
    BX (2)ADD (3)SUB (4)MOV BX,AX (5)INC DI (6)INC SI 解析:此程序要实现的功能是:内存中连续存放着20个无符号二进制字序列Xi(i=1,2…,20),字的最高3位为000,此序列对应某一信号在一段时间内的连续变化,现对该信号进行一阶低通数字滤波,其滤波方程为:
    Yi=(15*Yi-1/16)+(Xi/16),Y0=0。Yi(i=1,2,…,20)为滤波后得到的新序列,结果存入内存。
    此程序的关键是要会将滤波方程灵活地拆开来,才能更好地理解程序。上面的公式可以拆成这样:Yi=Yi-1+Xi/16-Yi-1/16,Y0=0。Yi(i=1,2,…,20)。
    程序的堆栈段定义了一个128个字节的堆栈区。堆栈段下面是数据段。数据段中定义了两个字型变量:原始数据区SOURCE、结果数据区RESULT;两个字节型变量:原始数据文件名NAME0、结果数据文件名NAME1。数据段下面是代码段,告诉汇编程序,代码段、数据段和堆栈段分别属于段寄存器CS、DS、SS。
    先将原始数据的偏移地址装入到SI中,结果数据存放的偏移地址装入到DI中。CX赋值为N,用于控制循环处理的次数。BX赋初值为0,表示Y0=0。注意:BX总是存放前一计算的结果,即Yi-1。
    AGN0段,先将BX暂存DX,表示Yi-1。所以第(1)空填写"BX"。取第一个无符号二进制字即 SI中内容Xi送AX,然后将CX压入堆栈,保存原现场,再给CX赋值为4,等用完了CX的这个值后,将CX从堆栈中弹出,返回操作系统。
    AGN1段,先将BX和AX都逻辑右移一位,然后再从AGN1入口处循环,继续将BX和AX逻辑右移一位,这样一共循环四次,就将BX和AX都逻辑右移了四位,即BX和AX的值都变成了原来的1/16,即Yi-1/16和Xi/16。然后将CX从堆栈中弹出。将AX即Xi/16与DX即Yi-1相加,结果先放AX中。然后再将AX减去BX即Yi-1/16,结果放AX中,就得到了Yi的值。然后将结果AX印Yi存入到DI中。再将AX值即Yi赋给BX,BX将作为计算下一个值Yi+1,的参照数。DI地址两次加1,准备存储下—个Yi, SI地址也两次加1,准备取下一个Xi进行计算。因为原始数据Xi和结果数据Yi都是 字序列,每个数存放在内存中连续两个地址空间中。然后从AGN0入口处循环,继续计算,进行下一次滤波,得到下一个值即Yi+1。从上面的分析来看,第(2)空填写"ADD",第(3)空填写"SUB",第(4)空填写"MOV BX, AX",第(5)空填写"INC DI",第(6)空填写"INC SI"。

  • 第3题:

    请思考如何利用变址寻址方式,进行1000个数在内存中的移动?并试着用代码进行说明。 (假设1000个数在内存中连续存放,主存按字编址,若是将其从起始地址2000处搬到地址6000的地方。)


    EA=3000H
    EA= 1000H
    EA=3000H
    EA=4000H
    E

  • 第4题:

    请编制程序,其功能为:将内存中存放的连续的30个二进制数(0到100之间),按数值大小分别进行统计,0~59为D,60~74为C,75~84为B,85~100为A,统计出A、B、C、 D的个数,并按A、B、C、D次序存放在内存中。

    例如:内存中原始数据为:21H,3CH,4DH,31H,4FH,51H,56H

    统计结果:1,3,1,2

    部分程序已经给出,其中原始数据由LOAD过程从文件INPUT1.DAT中读入从SOURCE开始的内存单元,转换结果(要求从RESULT 开始读入)由SAVE过程保存到OUTPUT1.DAT文件中。请在BEGIN和END之间补充使其完整,完成要求的功能。或删除BEGIN和END之间原有的代码并自行编程来完成要求的功能。

    对程序必须进行汇编,并与IO.OBJ链接产生PROG1.EXE执行文件,最终产生运行结果。

    部分程序如下:

    ;PROG1.ASM

    EXTRN LOAD:FAR, SAVE:FAR

    N EQU 30

    DSEG SEGMENT

    SOURCE DB N DUP (?)

    RESULT DB N DUP (0)

    NAME0 DB 'INPUT1. DAT',0

    NAME1 DB 'OUTPUT1. DAT',0

    DSEG ENDS

    SSEG SEGMENT STACK

    DB 128 DUP (?)

    SSEG ENDS

    CSEG SEGMENT

    ASSUME CS:CSEG, DS:DSEG; SS:SSEG

    START PROC FAR

    PUSH DS

    XOR AX,AX

    PUSH AX

    MOV AX, DSEG

    MOV DS,AX

    MOV ES, AX

    LEA DX, SOURCE

    LEA SI,NAME0

    MOV CX,N

    CALL LOAD

    ; *** BEGIN ***

    MOV CX,N

    LEA SI,SOURCE

    CONT: MOV AL,[SI]

    _____________

    JB LB

    INC RESULT

    JMP OK

    LB: CMP AL, 75

    JB LC

    INC ______

    JMP OK

    LC: CMP AL,60

    JB LD

    ____________

    JMP OK

    LD: ____________

    OK: INC SI

    LOOP CONT

    ; *** END ***

    LEA DX,RESULT

    LEA SI,NAME1

    MOV CX,4

    CALL SAVE

    RET

    START ENDP

    CSEG ENDS

    END START


    正确答案:; *** BEGIN *** MOV CX N LEA SI SOURCE CONT: MOV AL [SI] CMP AL 85 JB LB INC RESULT JMP OK LB: CMP AL 75 JB LC INC RESULT+1 JMP OK LC: CMP AL 60 JB LD INC RESULT+2 JMP OK LD: INC RESULT+3 OK: INC SI LOOP CONT ; *** END *** [INPUT1.DAT 中的输入数据]: 60H3CH4DH 31H4FH51H56H59H41H32H 35H21H4FH3AH21H2BH51H 11H45H44H 3AH 1EH3BH34H3CH46H63H24H40H3EH [输出结果]: 04 05 08 OD
    ; *** BEGIN *** MOV CX, N LEA SI, SOURCE CONT: MOV AL, [SI] CMP AL, 85 JB LB INC RESULT JMP OK LB: CMP AL, 75 JB LC INC RESULT+1 JMP OK LC: CMP AL, 60 JB LD INC RESULT+2 JMP OK LD: INC RESULT+3 OK: INC SI LOOP CONT ; *** END *** [INPUT1.DAT 中的输入数据]: 60H,3CH,4DH, 31H,4FH,51H,56H,59H,41H,32H 35H,21H,4FH,3AH,21H,2BH,51H, 11H,45H,44H 3AH, 1EH,3BH,34H,3CH,46H,63H,24H,40H,3EH [输出结果]: 04 05 08 OD

  • 第5题:

    请编制程序,其功能是:内存中连续存放着20个ASCII字符,如果是小写字母a~z之间的字符,请把它们转换成相应的大写字符;若为其他字符,不作转换。

    例如:

    内存中有61H('a'),62H('b'),31H('1'),41H('A'),42H('B')…

    结果为 41H('A'),42H('B'),31H,41H('A'),42H('B')…

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

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

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

    试题程序:


    正确答案:(1)UPPER2 (2)'Z' (3)A (4)AL0DFH (5)AL (6)SI (7)DI (8)LOOP
    (1)UPPER2 (2)'Z' (3)A (4)AL,0DFH (5)AL (6)SI (7)DI (8)LOOP 解析:此程序要求实现的功能是:将内存中连续存放着的20个ASCII字符,如果是小写字母a~z之间的字符,把它们转换成相应的大写字符;若为其他字符,不作转换。
    程序的堆栈段定义了一个128字节的堆栈区。堆栈段下面是数据段。数据段中定义了四个字节型变量:原始数据区SOURCE、结果数据区RESULT、原始数据文件名NAME0、结果数据文件名NAME1。数据段下面是代码段,告诉汇编程序,代码段、数据段和堆栈段分别属于段寄存器CS、DS、SS。
    先将原始数据的偏移地址装入到SI中,结果数据存放的偏移地址装入到DI中,CX赋值为N,用于控制循环处理的次数。
    NEXT段,取第一个原始ASCII字符,即将SI中内容送AL,将AL与'a'做比较,若AL小于字符'a'的ASCII值,说明AL为大写字母或其他字符,则转向UPPER2处执行;否则,将AL与字符'z'再做比较,若AL大于字符'z'的ASCII值,说明AL为其他字符,仍转向UPPER2处执行;否则,AL大于等于字符'a'的ASCII值,小于等于字符'2'的ASCII值,说明AL为小写字母a~z之间的字符。因为小写字母的ASCII值范围是61H~7AH,大写字母的ASCII值范围是41H~5AH,所以要将小写字母变成大写字母的话,只需将小写字母的ASCII值和0DFH进行逻辑与操作。读者可以试一下,将61H~7AH之间的值和0DFH进行逻辑与操作,看是否能得到41H~5AH之间的值。从上面的分析来看,第(1)空填写"UPPER2",第(2)空填写"'2'",第(3)空填写"A",第(4)空填写"AL,0DFH"。
    UPPER2段,当字符AL不为小写字母,为大写字母或其他字符时,不需将它做任何变换,直接将该字符AL存入到DI中。所以第(5)空填写"AL"。接着,SI地址加1,准备取下一个字符,继续判断;
    DI地址加1,准备存储下一个转换后或不需转换的字符。然后从NEXT入口处循环,继续下一个字符的处理。一共循环CX即20次,才能完成程序的功能。所以第(6)空填写"SI",第(7)空填写"DI",第(8)空填写"LOOP"。