问答题 写一个程序用十六进制数形式在屏幕上显示从10000H处开始的32个双字的值。
【正确答案】10000H可以将段基址和偏移量划分为0FFFH:0010H开始的地址。
   .886   ;支持对80386非特权指令的汇编
   CSEG    SEGMENT  LJSE16   ;16位段
           ASSUME   CS: CSEG
           N DB  0
   BEGIN:  MOV    AX,0FFFH
           MOV    FS,AX
           MOV    CX,20H    ;初始化32个双字
   LP:     MOV    EAX,FS: [0010H+4*N]
           PUSH   CX    ;将CX入栈保护
           CALL   TOHEX
           MOV    AL,'H'
           CALL   ECHO
           CALL   NEWLINE
           INC    N
           POP    CX;将CX恢复
           LOOP   LP
           MOV    AH,4CH
           INT    21H
    TOHEX  PROC   NEAR
    COUNTB  =     8
          ENTER   COUNTB,0
          MOVZX   EBP,BP
          MOV     ECX,COUNTB
          MOVZX   EDX,EAX
   HEX1:  MOV     AL,DL
          AND     AL,0FH
          MOV     [EBP-COUNTB+ECX-1],AL
          ROR     EDX,4
          LOOP    HEX1
          MOV     CX,COUNTB
          XOR     EBX,EBX
   HEX2:  CMP     BYTE PTR[EBP-COUNTB+EBX],0
          JNZ     HEX3
          INC     EBX
          LOOP    HEX2
          DEC     EBX
          MOV     CX,1
   HEX3:  MOV     AL,[EBP-COUNTB+EBX]
          INC     EBX
          CALL    TOASC
          CALL    ECHO
          LOOP    HEX3
          LEAVE
          RET
   TOHEX  ENDP
           ;子程序名: TOASC
           ; 功能: 把一位十六进制数转换为对应的ASCⅡ码
           ;入口参数: AL=要显示的值
           ;出口参数: AL=ASCⅡ码
   TOASC    PROC    NEAR
            AND     AL,0FH
            ADD     AL,'0'
            CMP     AL,'9'
            SETA    DL    ;当AL中的值大于39H时,DL置1,否则清0
            MOVZX   DX,DL    ;将DL中的内容扩展到DX中
            IMUL    DX,7
            ADD     AL,DL    ;AL中为转换后的ASCⅡ码
            RET
   TOASC    ENDP
   ECHOCH   PROC    NEAR
            MOV     AH,02H
            MOV     DL,AL
            INT     21H
            RET
            ENDP
   NEWLINE  PROC    NEAR
            MOV     AH,02H
            MOV     DL,0DH
            INT     21H
            MOV     DL,0AH
            INT     21H
            RET
            ENDP
   CODE     ENDS
   END      BEGIN
【答案解析】