Hirdetés
Aktív témák
-
maddog
tag
hat koszi...
-
maddog
tag
hello
ezt a feladatot kaptam:
Készítsen assembly programot, ami a képernyő első oszlopába kiírja a saját nevét úgy, hogy a betűk egymás alatt legyenek, majd egy billentyű leütéséig balról jobbra görgeti a szöveget.
nyilvan egyszeru de meg annyit sem tudtam megcsinalni hogy kiirassak egy betut
holnapra meg kene csinalni
lecci segitsen valaki!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -
P.H.
senior tag
a feladat szövege alapján tényleg könnyebb lenne, de:
// -32
MOV( 4, CL );
while( CL != 0 ) do
BT(31, EAX);
RCR(1, EAX);
DEC( CL );
endwhile;
kód megegyezik a SAR EAX,CL = SAR EAX,04 utasítás hatásával, ami EAX-et előjelhelyesen elosztja 16-tal. De felette a kommentben -32 van, nem MOV(5,CL)-nek kellene ott lennie
POP(EBX); // ######## x érték visszatöltve
MOV( b, ECX );
XOR( ECX, EBX );
itt mi volt a szándék?
MOV(32, CL);
SUB(EDX, EDX);
while (CL != 0) do
SHR(1, EBX);
RCL(1, EDX);
DEC(CL);
endwhile;
ez EDX-be teszi az EBX értékét fordított bitsorrendben (ami EBX-ben a legkisebb helyiértékű bit volt, az EDX-ben a legnagyobb helyiértékű lesz). Ez volt a szándék?
Legközelebb csak holnap este tudok visszanézni.Arguing on the Internet is like running in the Special Olympics. Even if you win, you are still ... ˙˙˙ Real Eyes Realize Real Lies ˙˙˙
-
P.H.
senior tag
egyszerűbb, hogy mi nem hiba. No lássuk (ha nem baj, átírom az eredeti op dest,src formára).
push ebx // EBX mentése, ok
mov eax,v1 // EAX -> V1, ok
mov ebx,[eax] // EBX <- alsó szó
if (ebx < 0) then // az előjelet a felső szó [eax+04h] hordozza
mov edx,[ebx] // az EAX mutat a V1-re, nem EBX
mov eax,[ebx+04h] // szintén
neg edx // ezt így nem lehet: neg(x) = not(x)+1,
neg eax // not-olni lehet a tagokat külön, de átvitel van +1 miatt és csak az alsó szóhoz kell 1-et adni, a felsőhöz csak az átvitelt
else
mov ebx,v1 // EBX -> V1, ok
mov edx,[ebx] // EDX-be a felső szó kell, [ebx+04h]
mov eax,[ebx+04h] // így EAX-be kell az alsó, [ebx+00h]
pop ebx // EBX helyreállítása, ok
[Szerkesztve]Arguing on the Internet is like running in the Special Olympics. Even if you win, you are still ... ˙˙˙ Real Eyes Realize Real Lies ˙˙˙
-
KngAlex
tag
Ebben mi a hiba?
Begin Abs2;//(EDX:EAX)=|V1|
PUSH(EBX);
MOV(V1, EAX);
MOV([EAX], EBX);
if (EBX<0) then
// negálás
MOV([EBX], EDX);
MOV([EBX+4], EAX);
NEG(EDX);
NEG(EAX);
else
// eredeti érték áttöltése
MOV(V1, EBX);
MOV([EBX], EDX);
MOV([EBX+4], EAX);
endif;
POP(EBX);
End Abs2; -
P.H.
senior tag
procedure Abs2(var v1:int64);
begin
asm
mov ecx,[v1]
mov edx,[ecx+04h]
mov eax,[ecx+00h]
test edx,edx
jns @end
not eax
not edx
add eax,01h
adc edx,00h
@end:
end; end;Arguing on the Internet is like running in the Special Olympics. Even if you win, you are still ... ˙˙˙ Real Eyes Realize Real Lies ˙˙˙
-
KngAlex
tag
Az abszolútértékes kelle még de nagyon!!!
-
KngAlex
tag
Ez az egész program:
Unit unit_2;
#include(''stdlib.hhf'');
ReadOnly
neptun:string;@external;
neptun:string:=''uz8rdl'';
procedure Fgv21(VAL a:dword; VAL b:dword);
@use EAX;@returns(''EAX'');@external;
procedure Fgv21(VAL a:dword; VAL b:dword);
@nodisplay;
begin Fgv21;
// d --> x=(b#(b#N_1)_5 : a#31_7 : b#9_8 : a#3_7)#+32 y=(a#18_13 : a#15_7 : b#21_8)#-32
// r --> Fgv21= (x ^ b)#T + ( y#(a#N_1)_3 : (a#29_19)#>>5 )#-32
// otodik betu (1):
push(ebx);
push(ecx);
push(edx);
//a#3_7
MOV(a,ebx);
ROR(3,ebx);
SHRD(7,ebx,eax);
//b#9_8
Mov(b,ebx);
ROR(9,ebx);
SHRD(8,ebx,eax);
//a#31_7
MOV(a,ebx);
ROR(31,ebx);
SHRD(7,ebx,eax);
//megszámolja hány 1-es van b ben
MOV(b, EDX);
SUB(EBX, EBX);
MOV(32, CL);
while (CL != 0) do
SHR(1, EDX); //eltolás jobbra, bit a cf-be
ADC(0, EBX); //EBX=EBX+CF+0;
DEC(CL); //CL--;
endwhile;
//(b#(b#N_1)_5) b#egyesekszáma_5
MOV( b, EDX );
while (EBX != 0) do
ROR(1, EDX);
DEC(EBX);
endwhile;
SHRD( 5, EDX, EAX );
//eltárolom x-et
ROR(5, EAX);
PUSH(EAX);
sub( EAX, EAX );
//b#21_8
MOV(b,ebx);
ROR(21,ebx);
SHRD(8,ebx,eax);
//a#15_7
MOV(a,ebx);
ROR(15,ebx);
SHRD(7,ebx,eax);
//a#18_13
MOV(a,ebx);
ROR(18,ebx);
SHRD(13,ebx,eax);
// -32
MOV( 4, CL );
while( CL != 0 ) do
BT(31, EAX);
RCR(1, EAX);
DEC( CL );
endwhile;
PUSH(EAX);
SUB( EAX, EAX );
//a#29_19
MOV(a,ebx);
ROR(29,ebx);
SHRD(19,ebx,eax);
//#>>5
// SUB( EBX, EBX );
// SHL( 5, EAX );
MOV( 5, CL );
while (CL != 0) do
BT(31, EAX);
RCR(1, EAX);
DEC(CL);
endwhile;
//a#N_1
MOV(a, EBX);
MOV(32, CL);
SUB(EDX, EDX);
while (CL != 0) do
SHR(1, EBX);
ADC(0, EDX);
DEC(CL);
endwhile;
POP( EBX ); // ###### y érték visszatöltve
while (EDX != 0) do
ROR(1, EBX);
DEC(EDX);
endwhile;
SHRD(3, EBX, EAX);
MOV(10, CL);
while (CL != 0) do
BT(31, EAX);
RCR(1, EAX);
DEC(CL);
endwhile;
// x^b
POP(EBX); // ######## x érték visszatöltve
MOV( b, ECX );
XOR( ECX, EBX );
SUB(ECX, ECX);
// #T
MOV(32, CL);
SUB(EDX, EDX);
while (CL != 0) do
SHR(1, EBX);
RCL(1, EDX);
DEC(CL);
endwhile;
ADD(EDX, EAX);
pop(edx);
pop(ecx);
pop(ebx);
end Fgv21;
end unit_2; -
P.H.
senior tag
Milyen nyelv lenne ez? Bocs, nem ismerem fel.
function osszead4(var v1:int64; var v2:int64): int64; // ez így lenne Pascalban, Delphiben
begin
asm
pushad
mov esi,[V1]
mov edi,[V2]
lea ebx,[RESULT] // vagy lea ebx,[R]
mov eax,[esi+00h]
mov edx,[esi+04h]
add eax,[edi+00h]
adc edx,[edi+04h]
mov [ebx+00h],eax
mov [ebx+04h],edx
popad end; end;
A harmadikat is tedd be, ha ordas a hiba, szembeötlő lesz.Arguing on the Internet is like running in the Special Olympics. Even if you win, you are still ... ˙˙˙ Real Eyes Realize Real Lies ˙˙˙
-
KngAlex
tag
A harmadik feladat részben megvan csak hibás és nem találom a hibát.
Elmagyarázni elég nehéz lessz mit is csinál a program.
Elég ha abban a kettőben tudnátok segíteni amit beírtam. -
P.H.
senior tag
Az assembly elég típustalan, de nem ennyire. Kicsit több infó kellene, változó típusa, milyen fordítónak (inline vagy fordítós) kell, azt gondolom, hogy x86 kell:
1-re a lényeg:
-- asm
mov eax,[x]
test eax,eax
jns @abs
neg eax
@abs:
mov [x],eax end;
-- asm
mov eax,[x]
cdq
xor eax,edx
sub eax,edx
mov [x],eax end;
2. elég blőd így, gondolom, nem a mov eax,[x]; add eax,[y]; mov [z],eax; -ra gondolsz. kicsit írd körül.
3. ?
[mod]: kódszerűség
[Szerkesztve]Arguing on the Internet is like running in the Special Olympics. Even if you win, you are still ... ˙˙˙ Real Eyes Realize Real Lies ˙˙˙
-
kisfurko
senior tag
Talán, ha specifikálnád a jobban a problémákat, akkor segíthetnénk is. Milyen processzor, mi a feladat pontosan stb.
Abszolút érték előállítása majdnem minden architektúrán annyi, hogy megnézed, hogy negatív-e (általában van ilyen flag, tehát csak elágaztatni kell), s ha az, akkor negálod. Ha nincs negálás, akkor kizáró vagy csupa 1-es bittel és +1, vagy kivonod a csupa 1-es bitből (legnagyobb ábrázolható szám a regiszterrel).
Két változó összeadása egy sima összeadó utasítás.
Bitcserélgetést pedig shiftelő és rotáló, valamint és és vagy utasításokkal tudsz csinálni. -
KngAlex
tag
Assemblyben kellene segíteni 3 program megírásában:
Nem túl bonyolult rövid programok:
1, Egy változó abszolút értékét kell megadni.
2, Két változót összeadni.
3, Bitcserélős feladat. (bővebben majd leírom)
Aktív témák
- HP EliteBook 850 G7 Fémházas Szuper Strapabíró Laptop 15,6" -65% i7-10610U 16/512 FHD HUN
- Szép! HP EliteBook 850 G7 Fémházas Szuper Strapabíró Laptop 15,6" -65% i7-10610U 8/512 FHD HUN
- 486 CPU bazár
- S3 Trio64V2/DX 1 MB PCI videokártya
- Gamer Pc eladó! I5-9400F/Asus GTX 1660 Ti/16GB RAM 3000mhz/256GB SSD+500GB HDD
Állásajánlatok
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest