试编制一个程序 把BX寄存器内的二进制数用十六进制数的形式在屏幕上显示出来。

大学 寄存器,形式,程序 已帮助 人

试编制一个程序,把BX寄存器内的二进制数用十六进制数的形式在屏幕上显示出来。

请帮忙给出正确答案和分析,谢谢!

热搜:宏病毒一般是指用basic书写的病毒程序寄存在

答案解析

难度★★☆ 搜索
  • 正确答案:根据题意应该把Bx的内容从左到右每4位为一组在屏幕上显示出来显然这可以用 循环结构来完成每次循环显示一个十六进制数位因而循环次数是已知的计数值为4。循环 体中则包括从二进制到所显示字符的AsCII码之间的转换以及每个字符的显示后者可以使用 DOS功能调用来实现。读者可以自己画出程序框图。这里采用循环移位的方法把所要显示的4位二进制数移到最右边以便做数字到字符的转换工作。另外由于数字0~9的ASCII码为 30H~39H而A~F的ASCII码为41 H~46H所以把4位二进制数加上30H后还需要做一次判断如果为字符A~F则还应加上7才能显示出正确的十六进制数。 源程序如下: PROGRAM SEGMENT MAIN PROC FAR ASSIJME CS:PROGNAM START: :SET UP STACK FOR RETIJRN PUSH DS SUB AX.AX PUSH AX :MAIN PART 0F PROGRAM MOV CH.4 ROTATE: MOV CL.4 ROL BX.CL MOV AL.BL AND AL.0FH ADD AL.30 CMP AL.3AH JL PRINTIT ADD AL.7H PRlNTlT: MOV DL.AL MOV AH.2 INT 21 H DEC: CH JNZ ROTATE RET MAIN ENDP PROGRAM ENDS END START 在程序中没有使用LOOP指令这是因为循环移位指令要使用CL寄存器而LOOP指令要使用Cx寄存器为了解决CX寄存器的冲突问题这里使用CH寄存器存放循环计数值而用DEC及JNz两条指令完成LOOP指令的功能这说明即使用计数值控制循环结束也不是非用L00P指令不可这里只是提供了另一种方法而已。当然也可以把计数值初始化为0用每循环一次加1然后比较次数是否达到要求的方法来实现。或者仍用LOOP指令而用堆栈保存其中的一个信息(如计数值)来解决CX寄存器的冲突问题。总之程序设计是很灵活的只要算法和指令的使用没有错误都可以达到目的。
    根据题意,应该把Bx的内容从左到右每4位为一组在屏幕上显示出来,显然这可以用循环结构来完成,每次循环显示一个十六进制数位,因而循环次数是已知的,计数值为4。循环体中则包括从二进制到所显示字符的AsCII码之间的转换以及每个字符的显示,后者可以使用DOS功能调用来实现。读者可以自己画出程序框图。这里采用循环移位的方法把所要显示的4位二进制数移到最右边,以便做数字到字符的转换工作。另外由于数字0~9的ASCII码为30H~39H,而A~F的ASCII码为41H~46H,所以把4位二进制数加上30H后还需要做一次判断,如果为字符A~F,则还应加上7才能显示出正确的十六进制数。源程序如下:PROGRAMSEGMENTMAINPROCFARASSIJMECS:PROGNAMSTART::SETUPSTACKFORRETIJRNPUSHDSSUBAX.AXPUSHAX:MAINPART0FPROGRAMMOVCH.4ROTATE:MOVCL.4ROLBX.CLMOVAL.BLANDAL.0FHADDAL.30CMPAL.3AHJLPRINTITADDAL.7HPRlNTlT:MOVDL.ALMOVAH.2INT21HDEC:CHJNZROTATERETMAINENDPPROGRAMENDSENDSTART在程序中没有使用L,OOP指令,这是因为循环移位指令要使用CL寄存器,而LOOP指令要使用Cx寄存器,为了解决CX寄存器的冲突问题,这里使用CH寄存器存放循环计数值,而用DEC及JNz两条指令完成LOOP指令的功能,这说明即使用计数值控制循环结束也不是非用L00P指令不可,这里只是提供了另一种方法而已。当然也可以把计数值初始化为0,用每循环一次加1然后比较次数是否达到要求的方法来实现。或者仍用LOOP指令,而用堆栈保存其中的一个信息(如计数值),来解决CX寄存器的冲突问题。总之,程序设计是很灵活的,只要算法和指令的使用没有错误都可以达到目的。