回 帖 发 新 帖 刷新版面

主题:小弟才学汇编有个题不会,请高手帮忙

小弟才学汇编有个题不会,请高手帮忙编出一个完整的程序。
输入0-9中任何1个数,显示输出这个数的平方。比如自己输入5,显示在第1排,然后答案自动输出显示在第2盘25。
关键部分请高手给个注释,谢谢了。

回复列表 (共11个回复)

沙发

CODE    SEGMENT
    ASSUME CS:CODE
_START:    MOV    AH,1H
    INT    21H
    SUB    AL,30H
    MOV    BL,AL
    MOV    DL,0AH
    MOV    AH,2H
    INT    21H
    MOV    DL,0DH
    INT    21H
    MOV    AL,BL
    MUL    BL
    CALL    OUTPUT
    MOV    AH,4CH
    INT    21H
;
OUTPUT    PROC
    PUSH    AX
    PUSH    BX
    PUSH    CX
    PUSH    DX
    XOR    DX,DX
    MOV    CL,0
    MOV    BX,10000D
CONVERT:DIV    BX
    PUSH    DX
    CMP    AX,0
    JA    PRINT
    CMP    CL,1
    JE    PRINT
    JMP    CNTN
PRINT:    MOV    CL,1
    MOV    DL,AL
    ADD    DL,30H
    MOV    AH,2H
    INT    21H
CNTN:    CMP    BX,WORD PTR 1H
    JBE    RETURN
    XOR    DX,DX
    MOV    AX,BX
    MOV    BX,WORD PTR 0AH
    DIV    BX
    MOV    BX,AX
    POP    AX
    XOR    DX,DX
    JMP    CONVERT
RETURN:    POP    DX
    POP    DX
    POP    CX
    POP    BX
    POP    AX
    RET
OUTPUT    ENDP
CODE    ENDS
    END _START

其中OUTPUT是以前学的时候写的,不具有容错功能,只可参考.

板凳

你写的好象超出了我们学的范围。我运行了一次。运行不了啊。。。

3 楼

上程序几个运行特例结果:
6
36
E:\CPFROM~2\MASM5\ASM>mul
3
9
E:\CPFROM~2\MASM5\ASM>mul
9
81
E:\CPFROM~2\MASM5\ASM>mul
4
16

4 楼


sseg  segment
      db 80h dup(0)
sseg  ends
cseg  segment
      assume cs:cseg,ss:sseg
start: mov ah,01              ;输入一个字符功能键是可显示的
       int 21h
       and al,0fh              ;屏蔽高4位得到其十进制数因为从键盘上输入 的                                     的数字在电脑里是他的asc码值
       mul al                   ;自身乘自身即平方
       mov ah,4ch
       int 21h
cseg   ends 
       end start

5 楼

这些小程序自己认真写,蛮锻炼人的。
建议不要直接用别人的,起码要弄明白自己哪里卡着的,别人的思路是什么样的。

我们刚学不久也写过这程序,我做的输入0~9外的字符输出ERROR!
并且平方是以10进制输出的。在我博客里有(有部分说明):[url=http://blog.sina.com.cn/u/4c59c08a010007ud]http://blog.sina.com.cn/u/4c59c08a010007ud[/url]

6 楼

你博客里那个程序还是没办法运行。

7 楼

老师说我这个有些地方还需要修改,请高手帮忙修改下,谢谢
        DATA  SEGMENT
       TABLE  DB        0,1,4,9,16,25,36,49,64,81
         ASK  DB        0DH,0AH,'Please enter a nummble(0~9):',0DH,0AH,'$'
         SEV  DB        'Key (N/n) to close!$'
        OVER  DB        0DH,0AH,'ERROR!',0DH,0AH,'$'
        DATA  ENDS
        CODE  SEGMENT
              ASSUME    CS:CODE,DS:DATA
      START:  MOV       AX,DATA
              MOV       DS,AX       ;将数据送入DS
        STA:  MOV       DX,OFFSET SEV           ;输出提示
              MOV       AH,9
              INT       21H
              MOV       DX,OFFSET ASK
              MOV       AH,9
              INT       21H
              MOV       AH,1        ;输入数字
              INT       21H
              CMP       AL,'N'      ;判断输入是否为“N/n”
              JZ        CLO         ;为“N/n”则跳转至CLO
              CMP       AL,'n'
              JZ        CLO
              CMP       AL,'9'      ;输入数字与9和0进行比较
              JA        OVE         ;当数大于9或小于0则转移至OVE
              CMP       AL,'0'
              JL        OVE
              SUB       AL,30H      ;将字符3转换成数字3
              MOV       BL,AL
              LEA       SI,TABLE    ;将指针指向TABLE段
              MOV       AH,2
              MOV       DL,13
              INT       21H         ;输出回车符
              MOV       DL,10
              INT       21H         ;输出换行符
              MOV       AH,0        ;将AH清零
              MOV       AL,[SI+BX]
              DIV       DL          ;将TABLE中的数据除以10
              MOV       CH,AH       ;把余数送入CH中暂存
              CMP       AL,0        ;将商与0相比较
              JZ        AGI         ;商为零则跳转至AGI不输出商
              ADD       AL,30H      ;不为零则将数字转换成字符
              MOV       DL,AL
              MOV       AH,2
              INT       21H         ;输出商
        AGI:  MOV       AL,CH
              ADD       AL,30H
              MOV       DL,AL
              MOV       AH,2
              INT       21H         ;输出余数
              MOV       DL,13
              INT       21H         ;输出回车符
              MOV       DL,10
              INT       21H         ;输出换行符
              JMP       STA         ;循环
        OVE:  MOV       DX,OFFSET OVER          ;输出错误提示
              MOV       AH,9
              INT       21H
              JMP       STA
        CLO:  MOV       AH,4CH
              INT       21H         ;返回DOS
        CODE  ENDS
              END       START       ;整个程序结束

8 楼

我博客那个程序怎么会有问题呢?

[img]http://www.xztx.com/attachment/12_10773_0606afe561a7a3c.jpg[/img]
[img]http://www.xztx.com/attachment/12_10773_bea7f2c15d332aa.jpg[/img]
[img]http://www.xztx.com/attachment/12_10773_de5e7b205c720f6.jpg[/img]
[img]http://www.xztx.com/attachment/12_10773_e8b2590c3e956f9.jpg[/img]

DATAS SEGMENT
OUTERROR DB 0AH,0DH,'ERROR!$'
INPUT DB'PLEASE INPUT X(0..9):$'
TABLE DB 0H,1H,4H,9H,16H,25H,36H,49H,64H,81H
RESULT DB ?
BUF1 DB 0AH,0DH,'IT IS ='
BUF2 DB 4 DUP(?)
DATAS ENDS

STACKS SEGMENT
    DB 200 DUP(?)
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
    LEA DX,INPUT
    MOV AH,9
    INT 21H
   
    MOV AH,1
    INT 21H
   
    CMP AL,'0'
    JB  ERROR
    CMP AL,'9'
    JA  ERROR
   
    AND AL,0FH
    MOV BL,AL
    MOV BH,0
    MOV AL,TABLE[BX]
    MOV RESULT,AL
    LEA DI,BUF2
   
    MOV CL,4
    SHR AL,CL
    OR AL,30H
    MOV [DI],AL
    INC DI
   
    MOV AL,RESULT
    AND AL,0FH
    OR AL,30H
    MOV [DI],AL
    INC DI

    MOV BYTE PTR[DI],'$'
    MOV DX,OFFSET BUF1
    MOV AH,9
    INT 21H
    JMP EXIT
ERROR:LEA DX,OUTERROR
      MOV AH,9
      INT 21H
EXIT:MOV AH,4CH
    INT 21H
CODES ENDS
    END START



9 楼

不知道你说的有些地方要修改,指的哪里,但我还是完善了一下。
 DATA  SEGMENT
       TABLE  DB        0,1,4,9,16,25,36,49,64,81
         ASK  DB        0DH,0AH,'Please enter a nummble(0~9):',0DH,0AH,'$'
         SEV  DB        'Key (N/n) to close!$'
         ANS  DB        'THE RESULT IS:$'
        OVER  DB        0DH,0AH,'ERROR!',0DH,0AH,0AH,0DH,'$'
        DATA  ENDS
        CODE  SEGMENT
              ASSUME    CS:CODE,DS:DATA
      START:  MOV       AX,DATA
              MOV       DS,AX       ;将数据送入DS
        STA:  MOV       DX,OFFSET SEV           ;输出提示
              MOV       AH,9
              INT       21H
              MOV       DX,OFFSET ASK
              MOV       AH,9
              INT       21H
              
              MOV       AH,1        ;输入数字
              INT       21H
              
              CMP       AL,'N'      ;判断输入是否为“N/n”
              JZ        CLO         ;为“N/n”则跳转至CLO
              CMP       AL,'n'
              JZ        CLO
              
              CMP       AL,'9'      ;输入数字与9和0进行比较
              JA        OVE         ;当数大于9或小于0则转移至OVE
              CMP       AL,'0'
              JL        OVE
              
              SUB       AL,30H      ;将字符3转换成数字3
              MOV       BL,AL
              
              LEA       SI,TABLE    ;将指针指向TABLE段
              
              MOV       AH,2
              MOV       DL,13
              INT       21H         ;输出回车符
              MOV       DL,10
              INT       21H         ;输出换行符
              
              MOV       AH,0        ;将AH清零
              MOV       AL,[SI+BX]
              DIV       DL          ;将TABLE中的数据除以10
              
              MOV       CH,AH       ;把余数送入CH中暂存
              MOV       CL,AL
              CMP       AL,0        ;将商与0相比较
              JZ        AGI2         ;商为零则跳转至AGI不输出商
              LEA       DX,ANS
              MOV       AH,9
              INT       21H
              
              MOV       AL,CL
              ADD       AL,30H      ;不为零则将数字转换成字符
              MOV       DL,AL
              MOV       AH,2
              INT       21H         ;输出商
              JMP       AGI
        AGI2: LEA       DX,ANS
              MOV       AH,9
              INT       21H

10 楼

AGI:  
              MOV       AL,CH
              ADD       AL,30H
              MOV       DL,AL
              MOV       AH,2
              INT       21H         ;输出余数
              MOV       DL,13
              INT       21H         ;输出回车符
              MOV       DL,10
              INT       21H         ;输出换行符
              MOV       DL,13
              INT       21H         ;输出回车符
              MOV       DL,10
              INT       21H 
              JMP       STA        ;循环
        OVE:  MOV       DX,OFFSET OVER          ;输出错误提示
              MOV       AH,9
              INT       21H
              JMP       STA
        CLO:  MOV       AH,4CH
              INT       21H         ;返回DOS
        CODE  ENDS
              END       START       ;整个程序结束

我来回复

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