+ -
当前位置:首页 → 问答吧 → 有关输入输出的问题

有关输入输出的问题

时间:2011-06-05

来源:互联网

Assembly code
        DATA  SEGMENT
       ARRAY  DW        21,22,23,24,25,26,27
       COUNT  DW        ($-ARRAY)/2
      RESULT  DW        ?
     ADDRESS  DW        3 DUP(0)    ;定义地址表
        DATA  ENDS
      STACK1  SEGMENT   PARA  STACK
              DW        20H DUP(0)
      STACK1  ENDS
        CODE  SEGMENT
              ASSUME    CS:CODE,DS:DATA
      START:  MOV       AX,DATA
              MOV       DS,AX
              MOV       ADDRESS,OFFSET ARRAY    ;将ARRAY地址存入地址表 
              MOV       ADDRESS+2,OFFSET COUNT  ;将COUNT地址存入地址表 
              MOV       ADDRESS+4,OFFSET RESULT ;将RESULT地址存入地址表 
              MOV       BX,OFFSET ADDRESS       ;将地址表地址装入BX 
              CALL      SUM_PROC                ;调用求和子程序 
              MOV       DL,AL
              ADD       DL,30H
              MOV       AH,2
              INT       21H
              MOV       AH,4CH
              INT       21H
    SUM_PROC  PROC
              PUSH      AX                      ;将子程序中用到的寄存器入栈保护 
              PUSH      BX
              PUSH      SI
              PUSH      DI
              MOV       SI,[BX]                 ;将ARRAY地址取出,存入SI 
              MOV       DI,[BX+2]               ;将COUNT地址取出,存入DI 
              MOV       CX,[DI]                 ;将COUNT内容取出,存入cx作计数器 
              MOV       DI,[BX+4]               ;将RESULT地址取出,存入DI 
              XOR       AX,AX                   ;AX初始化 
        LOP:  ADD       AX,[SI]                 ;累加 
              ADD       SI,2                    ;修改指针,指向下一单元 
              LOOP      LOP
              MOV       [DI],AX                 ;将结果保存到RESULT中 
              POP       DI                      ;恢复寄存器 
              POP       SI
              POP       CX
              POP       AX
              RET
              ENDP
              ENDS
              END       START


上面这段代码的功能是用地址表传递参数,实现数组ARRAY单元的累加,想问一下,如何将最终的累加结果输出呢?
注释中写道mov [di],ax是将结果保存到result中,我想的是在执行完调用子程序的指令也就是在CALL SUM_PROC后加入以下代码mov ax,[di],add ax,30h, mov dl,ax,mov ah,2,int 21h。。。。不过好像不行
感觉问题可能出在ascii码转数值或者寄存器的某些问题上,希望大家指教
还有个问题也是有关输入输出的,就是如果通过10号功能输入,如何将所输入的字符转为相应的数值

作者: ryusonfrex   发布时间: 2011-06-05

这是一段显示十进制的子程序,结果在DX里
Assembly code

disp    proc
        mov ax,dx
        xor dx,dx
        mov bx,10
        mov cx,0
d1:
        cmp ax,10
        jb ok
        div bx
        add dl,30h
        push dx
        xor dx,dx
        inc cx
        jmp d1
ok:
        add al,30h
        push ax
        inc cx
d2:
        pop dx
        mov ah,2
        int 21h
        loop d2

        ret
disp    endp

作者: masmaster   发布时间: 2011-06-05

请问累加后结果是保存在[DI]中吗?我现在不太明白这之间的寄存器是如何相互调用存储的

作者: ryusonfrex   发布时间: 2011-06-05

你累加后的结果其实是以二进制数形式存储的,要将他转化为十进制输出,可以用div指令将你累加后的结果 1:除以100,得到商和余数分别存放在DX,AX中,将商(结果肯定是0~9)加上30h转化为其对应的ascii码,然后输出(也就是累加结果对应的百位),2:将1中得到的余数除以10,在按1的步骤输出(十位),3:将2中得到的余数直接加上30h,输出,也就得到各位。

作者: hachorse   发布时间: 2011-06-05

热门下载

更多