ورود

View Full Version : تعداد حروف یک رشته



ghasemloo
پنج شنبه 15 خرداد 1393, 12:48 عصر
سلام
خسته نباشید
شاید باور کنید من اینترنتو زیرو رو کردم نبود
این سایتو زیرورو کردم نیست
یا شاید من پیدا نکردم
من یه برنامه میخوام که تعداد حروف یک رشته چاپ کنه
تا اینجاشو بلدم
اما زمانی که میام مقدار Actlen رو چاپ کنم کارکترشو چاپ می کنه
لطفا یکی کمکم کنه
از مدیرا خواهش می کنم این تایپکو پاک نکنند
.model samall.data
maxlen db 20
actlen db ?
string db 20 dup('')

.stack
dw 128 dup('')
.code
main proc
mov ax,@data
mov ds,ax
mov es,ax

mov ah,10
mov dx,offset maxlen
int 21h

mov bx,0
mov bl,actlen

mov ah,02h
lea dx,actlen
int 21h

ends


end main

vahid-p
پنج شنبه 15 خرداد 1393, 15:33 عصر
مطمئنا زیر و رو نکردید. وگرنه همین یه تاپیک قبل نوشتم. و دقیقا از همون به تاپیک قبلیش هم ارجاع دادم.
یعنی تو دو سه روز اخیر این سومین تاپیک هست که در مورد چاپ یک عدد مشکل دارند.

لینک : http://barnamenevis.org/showthread.php?455088-%D9%85%D8%B4%DA%A9%D9%84-%D8%AF%D8%B1-%D8%AC%D9%85%D8%B9-2-%D8%B9%D8%AF%D8%AF

ghasemloo
پنج شنبه 15 خرداد 1393, 15:37 عصر
خب من در مورد این برنامه گفتم چیزی تو نت نیست نه در مورد مشکل چاپ

ghasemloo
پنج شنبه 15 خرداد 1393, 15:54 عصر
راه حل از این راحتر نیست؟عایا

alireza_s_84
پنج شنبه 15 خرداد 1393, 21:02 عصر
راه حل از این راحتر نیست؟عایا

.model <samall> .stack <100H>
.data


maxlen db 20
actlen db ?
string db 20 dup('')


.code
main proc
mov ax,@data
mov ds,ax

mov ah,10
mov dx,offset maxlen
int 21h

;_________________________________________________ _____________________________________


MOV AX,0
MOV AL,actlen
MOV CX,0
MOV BX,10

L6: MOV DX,0
DIV BX
INC CX
PUSH DX
CMP AX,0
JNE L6

L7: POP DX
ADD DX,48
MOV AH,02H
INT 21H
LOOP L7
;_________________________________________________ _____________________________________



ends


end main

ghasemloo
جمعه 16 خرداد 1393, 14:31 عصر
خیلی گلی
دمتم گرم
واقعا که بچه اهوازیا گلن:تشویق:
اگه میشه توضیح هم بدی ممنون میشم

alireza_s_84
جمعه 16 خرداد 1393, 20:01 عصر
خیلی گلی
دمتم گرم
واقعا که بچه اهوازیا گلن:تشویق:
اگه میشه توضیح هم بدی ممنون میشم
تا اون قسمتی که خط کامنت شروع میشه که کدهای خود شماست. نحوه چاپ اعداد در اسمبلی از این الگوریتم پشتیبانی میکنه:
ابتدا عدد مورد نظر رو توی یکی از ثباتها قرار میدهیم (معمولا AX)
سپس عدد رو بر 10 تقسیم میکنیم ، چون هدف ما چاپ عدد در مبنای دسیمال (دهدهی) هست ، (توی کد ما 10 رو ریختیم توی BX بعد AX رو بر BX تقسیم کردیم)
در هربار تقسیم باقیمانده رو به پشته اضافه میکنیم (مقدار خارج قسمت به AX میره و باقیمانده به DX برای همین ما DX رو میفرستیم به پشته)
اینکار رو اینقدر تکرار میکنیم تا خارج قسمت ما 0 بشه (در اینجا میام AX رو چک میکنیم با دستور CMP AX,0)
کارهای بالا رو توی حلقه ی L6 انجام دادیم.
تا اینجای کار ما ارقام تشکیل دهنده ی عددمون رو به ترتیب از بالا به پایین توی پشته ذخیره کردیم
بعد اومدیم به ترتیب این ارقام رو از پشته بیرون کشیدیم و برای چاپ اون را با 48 جمع کردیم (کد اسکی کارکتر برای چاپ بدست میاد) و در نهایت با تابع 02 از وقفه 21 چاپ کردیم.
حلقه ی L7 برای دودنه دونه بیرون کشیدن ارقام و چاپ اونها استفاده شد.