主题:做了一天了没错不过没有结果呀!!!!!!!!!
我的汇
[专家分:10] 发布于 2006-04-23 15:35:00
; 帮我呀
;我搞了一天了
;这个是输入十进制转为二进制然后显示出来的程序帮我看呀
.386
DATA SEGMENT
input DB 'input number:$'
BUF DB 5 DUP(?)
BIN DW ?
CC DB 'B',0dh.0ah,'$'
DATA ENDS
STACK SEGMENT STACK
DB 200 DUP(0)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,SS:STACK,DS:DATA
START:MOV AX,DATA
MOV DS,AX
lea dx,input;提显
mov ah,09h
int 21h
LEA SI,BUF;开始输入
MOV AH,1
MOV CX,0
AGAIN:INT 21H
CMP AL,0DH
JE CALPRO
SUB AL,30H
MOV [SI],AL
INC SI
INC CX
JMP AGAIN
CALPRO:LEA SI,BUF
LEA DI,BIN
CALL CHANGE;转换
mov cx,15 ;在这里放入显示程序
L: BT AX,CX
JC P
MOV DL,30H
JMP Q
P: MOV DL,31H
Q: MOV AH,2
INT 21H
DEC CX
JGE L
LEA DX,CC;显示回车
MOV AH,9
INT 21H
MOV AH,4CH;回到DOS
INT 21H
CHANGE PROC NEAR ;转换子程序
PUSH DX
PUSH BX
MOV AX,0
MOV DX,10
NEXT:PUSH DX
MUL DX
POP DX
MOV BL,[SI]
MOV BH,0
ADD AX,BX
INC SI
LOOP NEXT
MOV [DI],AX
POP BX
POP DX
RET
CHANGE ENDP
CODE ENDS
END START
回复列表 (共8个回复)
沙发
chenzep [专家分:3640] 发布于 2006-04-23 16:12:00
.MODEL SMALL
.386P
INCLUDE\COS\MAC\IO.ASM
DATA SEGMENT
BUF DB 100H DUP(0)
INFO1 DB 'Input a Dec:',0
INFO2 DB 'Output a Hex:',0
DATA ENDS
STACK SEGMENT
DB 100H DUP(0)
STACKLEN = $
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START:
MOV AX,DATA
MOV DS,AX
MOV AX,STACK
MOV SS,AX
MOV SP,STACKLEN
MOV SI,OFFSET INFO1
DISP_STR SI
MOV SI,OFFSET BUF
GET_STR SI
CRLF
STRD_TO_EAX SI
MOV SI,OFFSET INFO2
DISP_STR SI
DISP_32 EAX
MOV AH,04CH
INT 21H
CODE ENDS
END START
用我发给你的宏写的,我把该宏保存在一个IO.ASM的文件中,我的机子编译运行通过了.
输入一个十进制数,输入一个16进制数~
比如:
INPUT: 255
OUTPUT : 0FFH
板凳
chenzep [专家分:3640] 发布于 2006-04-23 16:15:00
你广西那里的?
我玉林,在桂电读书.
给个QQ,加你.
上面的代码你别直接用,要改一下INCLUDE.
要我帮你看你的代码吗?
3 楼
C语言爱好者 [专家分:19410] 发布于 2006-04-23 16:20:00
有几个错误:
一、虽然在DOS下可以访问32位寄存器,但仍然不能使用32位代码,在各段属性中加上use16就可以改回16位代码。例如:
DATA SEGMENT use16
STACK SEGMENT use16 STACK
CODE SEGMENT use16
二、转换子程序逻辑错误,请重新设计。
4 楼
我的汇 [专家分:10] 发布于 2006-04-23 17:22:00
显示子程序逻辑错误吗????
mov cx,15 ;在这里放入显示程序
L: BT AX,CX
JC P
MOV DL,30H
JMP Q
P: MOV DL,31H
Q: MOV AH,2
INT 21H
DEC CX
JGE L
LEA DX,CC;显示回车
MOV AH,9
5 楼
我的汇 [专家分:10] 发布于 2006-04-23 17:25:00
用我发给你的宏写的,我把该宏保存在一个IO.ASM的文件中,我的机子编译运行通过了.
输入一个十进制数,输入一个16进制数~
比如:
INPUT: 255
OUTPUT : 0FFH
[/quote]
我要的是十进制转为二进制然后显示出来
6 楼
我的汇 [专家分:10] 发布于 2006-04-23 17:26:00
[quote]有几个错误:
一、虽然在DOS下可以访问32位寄存器,但仍然不能使用32位代码,在各段属性中加上use16就可以改回16位代码。例如:
DATA SEGMENT use16
STACK SEGMENT use16 STACK
CODE SEGMENT use16
二、转换子程序逻辑错误,请重新设计。[/quote]
逻辑错误!!
在哪!
书上的程序哟!
7 楼
我的汇 [专家分:10] 发布于 2006-04-24 19:19:00
不得结果!
8 楼
chenzep [专家分:3640] 发布于 2006-04-24 23:20:00
还是给一个完整的代码你把,该代码没有对输入数据进行检测.在MASM615编译通过
代码:
.MODEL SMALL
.386P
DATA SEGMENT
BUF DB 100,0,100 DUP(0)
INFO1 DB 'Input a Dec:$'
INFO2 DB 0DH,0AH,'Output a Bin:$'
DATA ENDS
STACK SEGMENT STACK
DB 100H DUP(0)
STACKLEN =$
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START:
MOV AX,DATA
MOV DS,AX
MOV AX,STACK
MOV SS,AX
MOV SP,STACKLEN
MOV DX,OFFSET INFO1
MOV AH,09H
INT 21H
MOV DX,OFFSET BUF
MOV AH,0AH
INT 21H
MOV CL,BUF+1
XOR CH,CH ;CX是输入的字符个数
MOV SI,OFFSET BUF+2 ;字符实际存放的首地址
XOR EBX,EBX ;转化结果放到EBX中,初始化EBX
XOR EAX,EAX ;初始化EAX
.WHILE CX>0
SHL EBX,1 ;EAX=EAX*2
LEA EBX,[EBX*4+EBX] ;上面的2个指令实际等于原来EAX的10倍
LODSB
SUB AL,'0'
ADD EBX,EAX
DEC CX
.ENDW
MOV DX,OFFSET INFO2
MOV AH,09H
INT 21H
MOV CX,32
.WHILE CX>0
MOV AL,'0'
RCL EBX,1
JNC OUTPUT
INC AL
OUTPUT:
PUSH BX
MOV BL,07H
MOV BH,0
MOV AH,0EH
INT 10H
POP BX
DEC ECX
.ENDW
MOV AX,4C00H
INT 21H
CODE ENDS
END START
我来回复