Wednesday, September 30, 2009

Ассемблер дээр Процедур хооронд утга дамжуулах

Доод түвшний хэл учираас энд Функц гэж бичсэнгүй Процедур гэж бичлээ.
Эхлээд С хэл дээр хэрхэн утга дамжуулдагийг жишээ болгон үзүүлье.
int myFunc(int a) // Ихэвчлэн хүлээн авах утга нь Integer төрлийх байвал AX регистрээр дамждаг
{
//statements...
return 0;
}
үүний ассемблер кодыг сонирхвол

_myFunc proc public
;damjuulsan utga AX registert baigaa
;statements...
mov ax,0
ret
_myFunc endp
Дээрхи аргыг Ассемблэр дээр Регистрээр дамжуулан аргумэнт(утга) дамжуулах гэж нэрлэдэг.
Регист нь Комьютерийн архитектур талаасаа бүтэцлэгдсэн бүхий л программын хувьд дундын байдаг тул хоёр процедурын хооронд утга дамжуулахад утга буцаахад регистр ашиглах нь түгээмэл байдаг.

Стек Санах ойгоор дамжуулан аргумэнт(утга) дамжуулах.
С хэлний хувьд ямар нэг хувьсагч зарлагдлаа гэж бодход шууд л стек санах ойгоос тухайн хувьсагчид харгалзах санах ойг шугаман урттайгаар нөөцөлчихдөг.
int a; //c

sub [sp:si],4 ; стек ойн заагчийг шууд 4байтаар хорогдуулах жишээтэй.
Мөн дан стек ой ашиглан аргумэнт дамжуулж болдог.
жишээ:
begin proc near
mov bx,45d
mov cx,89h
push bx ;стекээр ашиглан аргумэнт дамжуулж байна
push cx ;стекээр ашиглан аргумэнт дамжуулж байна

call myFroc
begin endp

myFroc proc near
pop ax ;дамжуулсан өгөгдлийг сэргээн авлаа
pop cx ;дамжуулсан өгөгдлийг сэргээн авлаа
;statements...
mov ax,0 ;регистрээр дамжуулан утга буцааж байна
ret
myFroc endp
end
Иймэрхүү байдлаар дээд түвшний хэлнүүд хоорондоо утга дамжуулдаг байхнээ.
Хүнд харагдах байдлаасаа гоё л харагдаж байгаа биз.
Харин цаанаа яг яагаад байгаа нь нэг иймэрхүү л.
Энд нэг анхаарууштай зүйл нь Стек ойтой ажиллахдаа болгоомжтой ажиллахгуй бол
жишээлбэл стек ойд ямар нэг юм хийчээд буцаан гаргахгуй бол Програм буруу ажиллахаас авхуулаад
Систем гэмтэх аюултай.
Харин 8085 ийн хувьд резет хийхээс нааш хэвийн ажиллах боломжгүй болдог.

No comments:

Post a Comment