回 帖 发 新 帖 刷新版面

主题:我是初学者虚心请教各位谢谢回帖

我想写一个可以做九九乘法标的程序,并在屏幕上显示出乘法表,请大家帮我看看我写的错在哪里,非常谢谢
DATA   SEGMENT
DATA   ENDS
CODE   SEGMENT
       ASSUME CS:CODE,DS:DATA
START  PROC  NEAR
       MOV   AX,DATA
       MOV   DS,AX
       MOV   CL,0AH
       MOV   AL,01H
       MOV   BL,01H
LOP0:  MOV   DL,AL
       MOV   AH,02H
       INT   21H
       MOV   DL,'*'
       MOV   AH,02H
       INT   21H
       MOV   DL,BL
       MOV   AH,02H
       INT   21H
       MUL   BL
       MOV   DL,AL
       MOV   AH,02H
       INT   21H
       INC   BL
       CMP   BL,CL
       JNZ   LOP0
LOP1:  INC   AL
       MOV   BL,AL
       CMP   AL,CL
       JNZ   LOP0
       MOV   AH,4CH
       INT   21H
START  ENDP    
CODE   ENDS
       END START

回复列表 (共3个回复)

沙发

首先,改作main proc near,start应该是标号。然后main endp,否则两者冲突。
使用proc要push旧DS和一个0(AX中)。
过程没有ret,无法返回DOS了。
输出的是ASCII码啊,你直接输出1*1,那个1作为ASCII对应输出的就是一个空格了
所以除了乘号正常显示,别的都是乱码了……
另外,显然99乘法表要16-10进制转换,楼主再去找本书看看参考的程序。

板凳

START是程序开始的标号,不能用作过程名.
当你用输出语句时,AL中的内容是会受到影响的.应该先把AL中的内容放到另一个位置.
当你想输出一个字符时,DL中应该放想输出字符的ASCII码.如果你想输出"1",DL中要放"31"才行.
计算机中两个数相乘的结果是十六进制,必须转化成十进制.输出十进制才能得到你想要的结果.
如果没用到数据段可以不用定义。
我帮你改了一下,你试试:
OUTW   MACRO
       OR    DL,30H
       MOV   AH,02H
       INT   21H
ENDM
CODE   SEGMENT
       ASSUME CS:CODE
START: MOV   CL,0AH
       MOV   CH,01H
       MOV   BL,00H
LOP:   INC   BL
       MOV   DL,BL
       OUTW
       MOV   DL,'*'
       MOV   AH,02H
       INT   21H
       MOV   DL,CH
       OUTW
       MOV   DL,3DH
       MOV   AH,02H
       INT   21H
       MOV   AL,CH
       MUL   BL
       AAM
       MOV   BH,AL
       CMP   AH,00H
       JE    NEXT
       MOV   DL,AH
       OUTW
 NEXT: MOV   DL,BH
       OUTW
       MOV   DL,' '
       MOV   AH,02H
       INT   21H
       CMP   CH,BL
       JNE   LOP
       MOV   DL,0DH
       MOV   AH,02H
       INT   21H
       MOV   DL,0AH
       MOV   AH,02H
       INT   21H
       INC   CH
       MOV   BL,00H
       CMP   CL,CH
       JNE   LOP
       MOV   AH,4CH
       INT   21H   
CODE   ENDS
       END START

3 楼

.model  small
.data 
.stack         ;九九乘法表的算法:双重循环,用bx做外循环,用ax做内循环,循环9次
.code
pro proc far
      push ds
      mov ax,0
      push ax
      mov ax,_data
      mov ds,ax
      mov al,1
      mov bl,1
    L1: cmp bl,9
        jl L2      ;带符号数小于时转L2
        jnl shuchu ;带符号数大于时转输出
        inc bl     ;修改bl
        jmp L1
    L2: cmp al,9
        jl shuchu   ;带符号数小于时转输出
        inc al      ;修改al
        jmp L2
shuchu: mov dl,al   ;输出
        mov ah,02h
        int 21h
        MOV   DL,'*'
        MOV   AH,02H
        INT   21H
        MOV   DL,BL
        MOV   AH,02h
        INT   21H
        MUL   BL
        MOV   DL,AL
        MOV   AH,02h
        int 21h
     ret
  pro endp
 end

我来回复

您尚未登录,请登录后再回复。点此登录或注册