注册 登录
编程论坛 汇编论坛

我不明白这个汇编程序怎么错了?

ensky_cy 发布于 2008-10-25 02:16, 1915 次点击
STAC SEGMENT
     DB  6 DUP(?)
STAC ENDS
DATA SEGMENT
     BUFFER DB 6 DUP(?)
DATA ENDS
CODE SEGMENT
     ASSUME   CS:CODE,DS:DATA,SS:STAC
START:
     MOV DX,0
     MOV BL,2
     LEA DI,BUFFER
INPUT:
     MOV AH,01H
     INT 21H         ;输入第一个字符
     SUB AL,30H      ;将输入的数字减去30h
     JL  EXIT
     CMP AL,0AH
     JA  EXIT
     CMP BL,1
     JE NEXT1
     PUSH BX
     MOV BL,10
     MUL BL          ;十位上数乘以10
     POP BX
     MOV [DI],AL
     DEC BL
     JNZ INPUT
     
NEXT1:
     MOV BX,2
     ADD [DI],AL
NEXT3:     
     MOV AL,[DI]
     CMP BX,2
     JL  NEXT2
     MOV CX,4
     SHL AL,CL        ;左移四位,相当于:0000 xxxx (xxxx表对应原高四位二进制数)
NEXT2:
     AND AL,0FH      
     MOV DL,AL
     MOV AH,02H
     INT 21H          ;输出DL中内容
     DEC BX
     JNZ NEXT3
EXIT:
CODE ENDS
     END START
     
 

;贴上我的操作提示,我的是64位CPU难道这也有影响?
[bo]补充一下:从键盘输入一个两位数(必需是数字),然后将这个两位数以对应十六进制输出。如:输入 45 (0010 1101),则输出为 2D(对应为十进制数)。[/bo]

[[it] 本帖最后由 ensky_cy 于 2008-10-26 00:14 编辑 [/it]]
14 回复
#2
ONEPROBLEM2008-10-25 09:35
建议楼主先给程序注释一下,有一些必要的说明~~
#3
wanjiang2008-10-25 10:39
起码说说这个程序你究竟想干什么嘛
#4
zklhp2008-10-25 11:42
[bo][un]ONEPROBLEM[/un] 在 2008-10-25 09:35 的发言:[/bo]

建议楼主先给程序注释一下,有一些必要的说明~~


否则我们也不明白……
#5
zklhp2008-10-25 11:43
[bo][un]ensky_cy[/un] 在 2008-10-25 02:16 的发言:[/bo]

STAC SEGMENT
     DB  6 DUP(?)
STAC ENDS
DATA SEGMENT
     BUFFER DB 6 DUP(?)
DATA ENDS
CODE SEGMENT
     ASSUME   CS:CODE,DS:DATA,SS:STAC
START:
     MOV DX,0
     MOV BL,2
     LEA DI,BUF ...


你这程序没结尾吧

和cpu没关吧

不过 偶一直搞不懂 64位到底有啥用  操作系统还是32位的 可它还能运行16位程序……

16位 32位 64位全在一起……

[[it] 本帖最后由 zklhp 于 2008-10-25 11:45 编辑 [/it]]
#6
zklhp2008-10-25 19:51
最后应该告诉电脑 你的程序完了

mov ah,4ch
int 21h

不过 加了程序也不对 没输出
#7
ensky_cy2008-10-26 00:16
[bo][un]zklhp[/un] 在 2008-10-25 19:51 的发言:[/bo]

最后应该告诉电脑 你的程序完了

mov ah,4ch
int 21h

不过 加了程序也不对 没输出

     [bo]MOV DL,AL
     MOV AH,02H
     INT 21H  
[/bo]
[bo]这个不是用于输出的吗?[/bo]
#8
ensky_cy2008-10-26 00:21
回复 6# zklhp 的帖子
加了mov ah,4ch
    int 21h
就没有那个错误提示了,谢谢了,不过还的请教为什么没有输出。
#9
zklhp2008-10-26 10:00
程序代码:

;MASMPlus 代码模板 - 纯 DOS 程序

.model small
DATA SEGMENT
    BUFFER DB 6 DUP(?)
DATA ENDS
CODE SEGMENT
    ASSUME CS:CODE,DS:DATA
START:
    mov ax,DATA
    mov ds,ax
    MOV BL,2
    LEA DI,BUFFER
INPUT:
    MOV AH,01H
    INT 21H        ;输入第一个字符
    SUB AL,30H     ;将输入的数字减去30h
    JL EXIT
    CMP AL,0AH
    JA EXIT
    CMP BL,1
    JE NEXT1
    mov cl,bl
    MOV BL,10
    MUL BL        ;十位上数乘以10
    mov bl,cl
    MOV [DI],AL
    DEC BL
    JNZ INPUT
    
NEXT1:
    MOV BX,2
    ADD [DI],AL
NEXT3:    
    MOV AL,[DI]
    CMP BX,2
    JL  NEXT2
    MOV cl,4
    mov dl,al
    SHR AL,cl       ;左移四位,相当于:0000 xxxx (xxxx表对应原高四位二进制数)
NEXT2:
    AND AL,0FH
    MOV DL,AL
    MOV AH,02H
    add dl,30h
    INT 21H        ;输出DL中内容
    DEC BX
    JNZ NEXT3
EXIT:
    mov ah,4ch
    int 21h
CODE ENDS
    END START

#10
zklhp2008-10-26 10:05
根据你的思路、算法改对了大概是这样

不过你的实现方法就有问题 你说怎么打字母呢 还得加个判断 当待输出字符是16进制的a-f时 不应该加30h
#11
zklhp2008-10-26 10:12
程序代码:

;MASMPlus 代码模板 - 纯 DOS 程序

.model small
DATA SEGMENT
    BUFFER DB 6 DUP(?)
DATA ENDS
CODE SEGMENT
    ASSUME CS:CODE,DS:DATA
START:
    mov ax,DATA
    mov ds,ax
    MOV BL,2
    LEA DI,BUFFER
INPUT:
    MOV AH,01H
    INT 21H        ;输入第一个字符
    SUB AL,30H     ;将输入的数字减去30h
    JL EXIT
    CMP AL,0AH
    JA EXIT
    CMP BL,1
    JE NEXT1
    mov cl,bl
    MOV BL,10
    MUL BL        ;十位上数乘以10
    mov bl,cl
    MOV [DI],AL
    DEC BL
    JNZ INPUT
    
NEXT1:
    MOV BX,2
    ADD [DI],AL
NEXT3:    
    MOV AL,[DI]
    CMP BX,2
    JL  NEXT2
    MOV cl,4
    mov dl,al
    SHR AL,cl       ;左移四位,相当于:0000 xxxx (xxxx表对应原高四位二进制数)
NEXT2:
    AND AL,0FH
    cmp al,10d
    jge CHAR
    add al,30h
    jmp OUTPUT
CHAR:
    add al,55d
OUTPUT:
    mov dl,ald
    MOV AH,02H
    INT 21H        ;输出DL中内容
    DEC BX
    JNZ NEXT3
EXIT:
    mov ah,4ch
    int 21h
CODE ENDS
    END START


好人做到底 这次改对了

不过 你的程序不怎么简练 有废话

还有 貌似都是用cx做计数器

循环中压栈费周期……

个人感觉 这种程序不用内存 直接用寄存器就行了

加油吧

[[it] 本帖最后由 zklhp 于 2008-10-26 10:13 编辑 [/it]]
#12
ensky_cy2008-10-26 21:35
回复 11# zklhp 的帖子
很好,很感谢!
上面OUTPUT后面一句 是 mov dl,al
呵呵,斑竹笔误了
再赞个,谢!
#13
vfdff2008-10-27 00:59
用什么编译的 ??
好像不同的编译器经常要求的格式有点差异
#14
ensky_cy2008-10-27 12:24
回复 13# vfdff 的帖子
我是把 MASM.EXE  LINK.EXE  MAKE.EXE...放到程序目录里,在cmd里直接搞
#15
zklhp2008-10-27 12:41
[bo][un]ensky_cy[/un] 在 2008-10-26 21:35 的发言:[/bo]

很好,很感谢!
上面OUTPUT后面一句 是 mov dl,al
呵呵,斑竹笔误了
再赞个,谢!


怎么还多个d 偶直接复制的呀?

反正差不多 看看就行了
1