PDA

View Full Version : سوال: نمایش یک عدد درون رجیستر



prpe26
دوشنبه 25 آبان 1394, 20:01 عصر
با سلام.

این برنامه یک استرینگ رو از ورودی میخونه، بعد تعداد a و A ها رو میشماره. ولی الان موندم که چطور این تعداد رو بیارم روی صفحه نمایش.


stk segment
DW 32 dup(?)
stk ends

dts segment
m1 db 10,13, 'Please enter a string (max 80 characters): ', 10,13, '$'
max db 80
len db ?
txt db 80 dup(?)
m2 db 10, 13, 'The numbers of a and A in the string is: ', 10, 13, '$'
dts ends

cds segment
assume cs:cds, ss:stk, ds:dts
main proc far
mov ax, seg dts
mov ds, ax
mov ah, 09
mov dx, offset m1
int 21h
mov ah, 0ah
mov dx, offset max
int 21h
mov ax, seg dts
mov ds, ax
mov ah, 09
mov dx, offset m2
int 21h
mov dl,0
mov cl, len
mov ch, 0
mov bx, offset txt
L3: cmp byte ptr [bx], 'A'
jne L1
inc dl
L1: cmp byte ptr [bx], 'a'
jne L2
inc dl
L2: inc bx
dec cx
cmp cx, 0
jne L3
mov ah, 4ch
int 21h
main endp
cds ends
end main

prpe26
سه شنبه 26 آبان 1394, 10:12 صبح
دوستان کسی نیست کمک بده؟

masoud.8086
سه شنبه 26 آبان 1394, 16:28 عصر
برای چاپ عدد در اسمبلی باید اونو به رشته نبدیل کنی ..برای این کار باید عددو به 10 تقسیم کنی و هر بار باقیماندشو بعلاوه 30 هگز کنی و به خروجی ببری...تا زمانی که خارج قسمت کوچکتر از 10 بشه اونوقت خارج قسمتم بعلاوه 30 هگز و به خروجی انتقال دهید

prpe26
سه شنبه 26 آبان 1394, 20:15 عصر
برای چاپ عدد در اسمبلی باید اونو به رشته نبدیل کنی ..برای این کار باید عددو به 10 تقسیم کنی و هر بار باقیماندشو بعلاوه 30 هگز کنی و به خروجی ببری...تا زمانی که خارج قسمت کوچکتر از 10 بشه اونوقت خارج قسمتم بعلاوه 30 هگز و به خروجی انتقال دهید

ببخشید دوست عزیز چطور باید این کار رو کنم؟ باید از Jump ها استفاده کنم؟ و این که چطور مقایسه رو انجام بدم؟

masoud.8086
سه شنبه 26 آبان 1394, 20:25 عصر
قرض کن عدد 15 درون ax هست خوبه میای با دستور div اونو به ده تقیسم میکنی وفتی تقسیم انجام میشه باقیمانده میشه 5 و خارج قسمت میشه یک خوب باقیمانده که 5 هست رو بعلاوه 30 هگز میکنی 30هگز برابر 48 دسیمال هست خوب حالا مقدار 53 رو با وقفه int 21 /ah,02 چاپ میکنی وبعد میای خارج قسمت که 1 هستو با 10 مقایسه میکنی اگر کوچکتر بود میبریش به چاپ و اگر بزرگتر بود دوباره تقسیم به 10 و همین طور تا آخر..

prpe26
سه شنبه 26 آبان 1394, 22:06 عصر
قرض کن عدد 15 درون ax هست خوبه میای با دستور div اونو به ده تقیسم میکنی وفتی تقسیم انجام میشه باقیمانده میشه 5 و خارج قسمت میشه یک خوب باقیمانده که 5 هست رو بعلاوه 30 هگز میکنی 30هگز برابر 48 دسیمال هست خوب حالا مقدار 53 رو با وقفه int 21 /ah,02 چاپ میکنی وبعد میای خارج قسمت که 1 هستو با 10 مقایسه میکنی اگر کوچکتر بود میبریش به چاپ و اگر بزرگتر بود دوباره تقسیم به 10 و همین طور تا آخر..

عزیز میتونی یه مثال کوچیک کدی بزنی؟ چون نمیدونم چطور با div باید کار کنم.

masoud.8086
چهارشنبه 27 آبان 1394, 18:57 عصر
خوب فرضا کن همون عدد 15 داخل ax
mov ax,15
p: div ten
add ah,30h
mov baghimande,ah
mov ah,02
mov dl,bahimande
int 21h
تا اینجا عدد 5 رو چا پ کردی بعد تقسیم باقیمانده میره تو ah وخارج قسمنت میره تو al خوب جالا میای al رو چک میکنی که از ده کوچکتره یا نهاگر کویچم تره بعلاوه 30 هگز بشه بره به چاپ مثل بالا و اگر نیس دوباره دستور div اجرا بشه
cmp al,10
jg p
add al,30h

prpe26
چهارشنبه 27 آبان 1394, 20:41 عصر
دوست عزیز این baghimandeh از کجا اومده؟ :| و این که آیا مقایسه ها نباید بالاتر از چاپ نتیجه باشه؟

masoud.8086
چهارشنبه 27 آبان 1394, 22:17 عصر
بایمانده ی متغیره میتونه هر اسمی باشه..و فرق نداره بعد یا قبل با هر دو صورت میشه البته با کمی تقاوت..

prpe26
چهارشنبه 27 آبان 1394, 22:29 عصر
بایمانده ی متغیره میتونه هر اسمی باشه..و فرق نداره بعد یا قبل با هر دو صورت میشه البته با کمی تقاوت..

خب من اسم baghimandeh رو گذاشتم ولی MASM ارور داد. البته طبیعیه خب از کجا بفهمه همچین چیزی بوده؟

masoud.8086
پنج شنبه 28 آبان 1394, 13:59 عصر
خوب دوست عزیز ب متغییر اید داخل دیتا سگمنت تعرییف بشه..

prpe26
جمعه 29 آبان 1394, 11:33 صبح
کد جدید من به این شکله و از خط ۴۵ (همون div) خطا میگیره و میگه immediate operand.


stk segment
DW 32 dup(?)
stk ends

dts segment
m1 db 10,13, 'Please enter a string (max 80 characters): ', 10,13, '$'
max db 80
len db ?
txt db 80 dup(?)
m2 db 10, 13, 'The numbers of a and A in the string is: ', 10, 13, '$'
baghimandeh db 32
dts ends

cds segment
assume cs:cds, ss:stk, ds:dts
main proc far
mov ax, seg dts
mov ds, ax
mov ah, 09
mov dx, offset m1
int 21h
mov ah, 0ah
mov dx, offset max
int 21h
mov ax, seg dts
mov ds, ax
mov ah, 09
mov dx, offset m2
int 21h
mov dl,0
mov cl, len
mov ch, 0
mov bx, offset txt
L3: cmp byte ptr [bx], 'A'
jne L1
inc dl
L1: cmp byte ptr [bx], 'a'
jne L2
inc dl
L2: inc bx
dec cx
cmp cx, 0
jne L3
mov dl, ah
L4: div 10
add ah, 30h
mov baghimandeh, ah
mov ah, 02
mov dl, baghimandeh
int 21h
cmp al, 10
jg L4
add al, 30h
mov ah, 4ch
int 21h
main endp
cds ends
end main

masoud.8086
جمعه 29 آبان 1394, 12:23 عصر
دوست عزیز جلو دستور div نمیشه عدد گذاشت (داخل 8086)باید ی متعییر تعریف کنی و عدد 10 رو برزی توش و بعد تقسیم انجام بدی....ی پیشنهاد به نظرم اول مقدمات برنامه نویسی اسمبلی رو مسلط بشید بعد برای انجام برنامه های پیچیده تر اقدام کنید..موفق باشید

prpe26
جمعه 29 آبان 1394, 14:05 عصر
بسیار خوب ، من اون کار رو کردم و کدم به این شکل شد، حالا نان استاپ ۰ میذاره توی خروجی!

پ.ن : این پروژه ای بود که برای درس زبان ماشین بهم دادن و من اینجا مشکل خوردم. وگرنه علاقه ای به یادگیری MASM ندارم.



stk segment
DW 32 dup(?)
stk ends

dts segment
m1 db 10,13, 'Please enter a string (max 80 characters): ', 10,13, '$'
max db 80
len db ?
txt db 80 dup(?)
m2 db 10, 13, 'The numbers of a and A in the string is: ', 10, 13, '$'
baghimandeh db 32 dup(?)
division db 10
dts ends

cds segment
assume cs:cds, ss:stk, ds:dts
main proc far
mov ax, seg dts
mov ds, ax
mov ah, 09
mov dx, offset m1
int 21h
mov ah, 0ah
mov dx, offset max
int 21h
mov ax, seg dts
mov ds, ax
mov ah, 09
mov dx, offset m2
int 21h
mov dl,0
mov cl, len
mov ch, 0
mov bx, offset txt
L3: cmp byte ptr [bx], 'A'
jne L1
inc dl
L1: cmp byte ptr [bx], 'a'
jne L2
inc dl
L2: inc bx
dec cx
cmp cx, 0
jne L3
mov dl, ah
L4: div division
add ah, 30h
mov baghimandeh, ah
mov ah, 02
mov dl, baghimandeh
int 21h
cmp al, 10
jg L4
mov ah, 4ch
int 21h
main endp
cds ends
end main

prpe26
شنبه 30 آبان 1394, 20:40 عصر
دوستان کسی نمیتونه کمک بده؟

prpe26
چهارشنبه 15 اردیبهشت 1395, 19:30 عصر
یک راه حلی که پیدا کردم (البته بیشتر برای BCD ها مطرحه) :

۱. مقایسه مقدار با ۹ و بعد carry کردن عدد یک به ۴ بیت بالایی.
۲. اگر کوچکترمساوی ۹ باشه با ۴۸ (یا ۳۰ هگز) جمعش کنیم.

Delphi Coder
چهارشنبه 22 اردیبهشت 1395, 01:11 صبح
یه زمانی اینو نوشته بودم برای ان کار. با توربو اسمبلر کار میکرد اما فکر کنم الان با emu8086 هم کار کنه. پروسیجر word_out عددی که توی ax هست رو مینویسه روی صفحه.
.model tiny
.286
.code
org 100h
start:
mov ax,2536
call word_out
ret
word_out proc near
pusha
pushf
lea di,str1
add di,4
std
loop1:
mov cl,10
div cl
or ah,30h
mov ch,al
shr ax,8
stosb
or ch,ch
jz continue1
mov al,ch
xor ah,ah
jmp loop1
continue1:
mov ah,09h
lea dx,str1
int 21h
popf
popa
ret
str1 db 5 dup (32),'$'
word_out endp
end start