PDA

View Full Version : اشکال در خروجی



MEHDI.MN1365
پنج شنبه 18 خرداد 1391, 22:54 عصر
سلام من برنامه تبدیل رشته 7 رقمی رو به عدد تا حد زیر نوشتم نمی دونم مشکلم کجاست چرا متغیر aمقدارش با رشته ورودیم بعد از تبدیل در ثبات ها فرق می کنه و اینکه خروجی رو هم که میده یه کاراکتر عجیب غریبه




DSEG SEGMENT 'DATA'
st label byte
max db 8
len db ?
buffer db 8 dup('')
dolar db '$'
msg1 db 'enter first num = ','$'
a dw ?
b dw ?
DSEG ENDS

SSEG SEGMENT STACK 'STACK'
db 256 DUP(0)
db 32 dup('stak')
SSEG ENDS

CSEG SEGMENT 'CODE'
START PROC FAR
assume ds:dseg,cs:cseg,ss:sseg
MOV AX, DSEG
MOV DS, AX
MOV ES, AX



mov dx,offset msg1
mov ah,09h
int 21h

mov ah,0ah
lea dx,st
int 21h

lea bx,buffer
mov ch,0
mov cl,len

add bx,cx
mov dl ,1
mov ax,0

p1: mov al,[bx]
sub al ,48
mul dl

mov a,ax
mov al,10
mul dl
mov dl,al
sub bx,1
loop p1
MOV AX, 4C00h
INT 21h
START ENDP
CSEG ENDS
END START

MostafaMohammadi
جمعه 19 خرداد 1391, 14:20 عصر
این اصلاح شده کد شما است ولی این برنامه اعداد بزرگتر از 65535 رو قبول نمیکنه:


; ------------------------------
; | 1- Introducing the program |
; ------------------------------
TITLE '7DIGITs.ASM' Gets a 7 digits numeric string and convert it to number
;
; ---------------------------------
; | 2- Defining the stack segment |
; ---------------------------------
SSEG SEGMENT STACK
DB 128 DUP(0)
SSEG ENDS
;
; --------------------------------
; | 3- Defining the data segment |
; --------------------------------
DSEG SEGMENT
ST LABEL BYTE
MAX DB 8
LEN DB ?
BUFFER DB 8 DUP(' ')
MSG1 DB 'Please enter a 7 digits number: ', '$'
MSG2 DB 'ERROR! Overflow, this number is greater than 65535.', '$'
MSG3 DB 'Do you want to continue? (Y=Yes, N=No): ', '$'
STR1 DB 32 DUP(0)
A DW ?
B DW ?
FACTOR2 DW 10
DSEG ENDS
;
; --------------------------------
; | 4- Defining the code segment |
; --------------------------------
CSEG SEGMENT
ASSUME CS:CSEG, DS:DSEG, SS:SSEG
START PROC FAR
MOV AX, DSEG
MOV DS, AX
;
; --------------------------
; | 5- Clearing the screen |
; --------------------------
REPEAT: MOV AH, 07h
MOV AL, 00h
MOV BH, 07h
MOV CX, 0000h
MOV DX, 184Fh
INT 10h
;
; ---------------------------------
; | 6- Going to line 0, column 0 |
; ---------------------------------
MOV AH, 2h
MOV BH, 00h
MOV DH, 0
MOV Dl, 0
INT 10h
;
; ------------------------------------------------
; | 7- Asking the user to enter a numeric string |
; ------------------------------------------------
MOV AH, 09h
LEA DX, MSG1
INT 21h
;
; ---------------------------------------------
; | 8- Getting a numeric string from keyboard |
; ---------------------------------------------
MOV AH, 0Ah
LEA DX, ST
INT 21h
;
; ----------------------------------------------
; | 9- Converting the numeric string to number |
; ----------------------------------------------
MOV AX, 0
MOV DX, 0
MOV CL, LEN
XOR CH, CH ;MOV CH, 0
LEA SI, BUFFER

P1: MOV BL, [SI]
XOR BH, BH ;MOV BH, 0
SUB BX, '0' ;'5' - '0' = 5
MUL FACTOR2
CMP DX, 0
JNE ERR1
ADD AX, BX
JB ERR1
INC SI
LOOP P1

MOV A, AX
JMP ASK
;
; ---------------------
; | 11- Printing error |
; ---------------------
ERR1: MOV AH, 2h
MOV DL, 13
INT 21h
MOV AH, 2h
MOV DL, 10
INT 21h

MOV AH, 09h
LEA DX, MSG2
INT 21h
;
; ------------------------------------------------------
; | 12- Asking the user if he wants to continue or not |
; ------------------------------------------------------
ASK: MOV AH, 2h
MOV DL, 13
INT 21h
MOV AH, 2h
MOV DL, 10
INT 21h

MOV AH, 09h
LEA DX, MSG3
INT 21h
WAIT1: MOV AH, 0h
INT 16h
CMP AL, 89
JE Y1
CMP AL, 121
JE Y1
CMP AL, 78
JE N1
CMP AL, 110
JE N1
JMP WAIT1
Y1: MOV AL, 'Y'
MOV AH, 0Eh
INT 10h
JMP REPEAT
N1: MOV AL, 'N'
MOV AH, 0Eh
INT 10h
;
; --------------------------
; | 13- End of the program |
; --------------------------
MOV AH, 01h
INT 21h
MOV AX, 4C00h
INT 21h
START ENDP
CSEG ENDS
END START
END

MostafaMohammadi
جمعه 19 خرداد 1391, 14:53 عصر
این برنامه شماست که می تونید تعداد ارقام عددی که از ورودی میگیرید رو تا 10 افزایش بدید ولی باز هم مثل برنامه قبل سقف عددی داره، اینبار حداکثر می تونید 4294967295 رو وارد کنید.

; ------------------------------
; | 1- Introducing the program |
; ------------------------------
TITLE '7DIGITs.ASM' Gets a 7 digits numeric string and convert it to number
;
; ---------------------------------
; | 2- Defining the stack segment |
; ---------------------------------
SSEG SEGMENT STACK
DB 128 DUP(0)
SSEG ENDS
;
; --------------------------------
; | 3- Defining the data segment |
; --------------------------------
DSEG SEGMENT
ST LABEL BYTE
MAX DB 8
LEN DB ?
BUFFER DB 8 DUP(' ')
MSG1 DB 'Please enter a 7 digits number: ', '$'
MSG2 DB 'ERROR! Overflow, this number is greater than 4294967295.', '$'
MSG3 DB 'Do you want to continue? (Y=Yes, N=No): ', '$'
STR1 DB 32 DUP(0)
A1 DW ?
A2 DW ?
B1 DW ?
B2 DW ?
FACTOR2 DW 10
DSEG ENDS
;
; --------------------------------
; | 4- Defining the code segment |
; --------------------------------
CSEG SEGMENT
ASSUME CS:CSEG, DS:DSEG, SS:SSEG
START PROC FAR
MOV AX, DSEG
MOV DS, AX
;
; --------------------------
; | 5- Clearing the screen |
; --------------------------
REPEAT: MOV AH, 07h
MOV AL, 00h
MOV BH, 07h
MOV CX, 0000h
MOV DX, 184Fh
INT 10h
;
; ---------------------------------
; | 6- Going to line 0, column 0 |
; ---------------------------------
MOV AH, 2h
MOV BH, 00h
MOV DH, 0
MOV Dl, 0
INT 10h
;
; ------------------------------------------------
; | 7- Asking the user to enter a numeric string |
; ------------------------------------------------
MOV AH, 09h
LEA DX, MSG1
INT 21h
;
; ---------------------------------------------
; | 8- Getting a numeric string from keyboard |
; ---------------------------------------------
MOV AH, 0Ah
LEA DX, ST
INT 21h
;
; ----------------------------------------------
; | 10- Converting the numeric string to number |
; ----------------------------------------------
MOV A1, 0
MOV A1, 0
MOV AX, 0
MOV DX, 0
MOV CL, LEN
XOR CH, CH ;MOV CH, 0
LEA SI, BUFFER

P1: MOV AX, A2
MUL FACTOR2
CMP DX, 0
JNE ERR1
MOV A2, AX

MOV AX, A1
MUL FACTOR2
CMP DX, 0
JE SKIP1
ADD A2, DX
JB ERR1
SKIP1: MOV A1, AX

MOV BL, [SI]
XOR BH, BH ;MOV BH, 0
SUB BX, '0' ;'5' - '0' = 5

ADD A1, BX
JAE SKIP2
ADD A2, 1

SKIP2: INC SI
LOOP P1
JMP ASK
;
; ---------------------
; | 10- Printing error |
; ---------------------
ERR1: MOV AH, 2h
MOV DL, 13
INT 21h
MOV AH, 2h
MOV DL, 10
INT 21h

MOV AH, 09h
LEA DX, MSG2
INT 21h
;
; ------------------------------------------------------
; | 17- Asking the user if he wants to continue or not |
; ------------------------------------------------------
ASK: MOV AH, 2h
MOV DL, 13
INT 21h
MOV AH, 2h
MOV DL, 10
INT 21h

MOV AH, 09h
LEA DX, MSG3
INT 21h
WAIT1: MOV AH, 0h
INT 16h
CMP AL, 89
JE Y1
CMP AL, 121
JE Y1
CMP AL, 78
JE N1
CMP AL, 110
JE N1
JMP WAIT1
Y1: MOV AL, 'Y'
MOV AH, 0Eh
INT 10h
JMP REPEAT
N1: MOV AL, 'N'
MOV AH, 0Eh
INT 10h
;
; --------------------------
; | 18- End of the program |
; --------------------------
MOV AH, 01h
INT 21h
MOV AX, 4C00h
INT 21h
START ENDP
CSEG ENDS
END START
END
توجه: عددی که کاربر وارد کرده به صورت A2:A1 در حافظه ذخیره شده.