PDA

View Full Version : سوال: شمردن یک های یک عدد باینری با استفاده از دستور asm



sinasafaee
جمعه 22 مهر 1390, 18:11 عصر
صورت سوال :
برنامه ای بنویسید که یک عدد را از ورودی بخواند و تعداد یک های آن عدد را در مبنای 2 حساب کند. (عدد 8 بیتی باشد و آن را داخل al قرار دهید )

من برنامه رو اینطوری نوشتم :
#include <iostream.h>
void main()
{
int a,b=0;
cout<<"Insert a number(0 to 255): ";
cin>>a;

for(int i=0;i<8;i++)
{
_asm{
mov ax,a
mov bx,1
and bx,ax
add b,bx
}
a/=2;
}
cout<<"Your number in Binary has "<<b<<" digit 1.";
}

الآن مشکلم اینجاست که نمی تونم عددم رو توی AL بریزم
کسی نظری نداره ؟

xman_1365_x
شنبه 23 مهر 1390, 04:30 صبح
باید از byte ptr استفاده میکردین راه آسونتر 8 بار شیفت میدادین بعد اگر کری 1 بود یکی به کانتر اضافه میکردین
#include <iostream>
using namespace std;

void main()
{
int a,b=0;
cout << "Insert a number(0 to 255): ";
cin >> a;

for(int i=0;i<8;i++)
{
_asm{
mov al,byte ptr a
mov bl,1
and bl,al
add byte ptr b, bl
}
a/=2;
}
cout<<"Your number in Binary has "<<b<<" digit 1.\n";
}
موفق باشی

xman_1365_x
شنبه 23 مهر 1390, 15:30 عصر
به شکل زیر بنویسید سریعتر هست ، حتما باید مقدار ثبات ها در برنامه های بزرگ ذخیره بشه که با تغییرشون ادامه برنامه با مشکل مواجه نشه

#include <iostream>
using namespace std;

void main()
{
int a,b=0;

cout << "Insert a number(0 to 255): \n";
cin >> a;

_asm{
push cx
push bx
push ax

mov al,byte ptr a
mov cl,1
xor ch,ch
xor bl,bl ;counter
again:
shr al,cl
jc add_counter

cmp ch,8
jae exit_count
inc ch
jmp again

add_counter:
inc bl
inc ch
jmp again
exit_count:

mov byte ptr b,bl

pop ax
pop bx
pop cx
}

cout<<"Your number in Binary has "<<b<<" digit 1.\n";
}