asm

14 отговора 762 прегледа
#1

asm

naskoro mi se slu4i ne6to za koeto vse o6te nqmam obqsnenie.
Imam masiv ot celi na adres pArray, iskam da pi6a w nego na opredelen offset:
.
.
.
mov ebx, pArray
mov ecx, Index ; Nqkakuw Index = 5 da re4m
mov [ebx+4*ecx], edi ; DAWA run-time error ?!?

oba4e ako zamestq posledniq red s:
mov [ebx+4*ecx], edx - vsi4ko e OK

Za6to se polu4awa taka ?

Отговор
в отговор на log #2

Re: asm

какъв е тоя run-time error?

Сигнатура!
Отговор
в отговор на log #3

Re: asm

Абе забравил съм ги тия неща вече, ама ако не се лъжа имаше някаква особеност при индексните регистри. Май не можеха да се зареждат от всеки регистър, а явно не не могат и да зареждат памет с всяка адресация. То там полето за операнд регистър вероятно е само 2 бита и в него кодират регистрите с общо предназначение. Пък асемблерът кой знае каква невалидна инструкция ти е изгенерирал, или още по-лошо - набутал е кода на друг регистър. Пробвай го дали ще мине с друг асемблер. Мен на бъг ми мирише.


System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
Отговор
в отговор на log #4

Re: asm

"mov ebx, pArray"
ти зарежда в ebx СТОЙНОСТТА на елемент 0 на pArray!

След това следва "access violation exception" и в двата случая, в зависимост от това, какво има в pArray[0].

Ползвай "lea ebx, pArray"

Отговор
в отговор на log #5

Re: asm

В прочем, ако ползваш inline assembler в C/C++:

При декларация
"int pArray[20]"
ползвай
"lea ebx, pArray".

При декларация
"int* pArray = new int [20]"
ползвай
"mov ebx, pArray".

Отговор
в отговор на log #6

Re: asm

хммм...като казваш run-time error, значи все пак го пишеш на език от високо ниво?
Защото съм забелязал, че inline-assembler-а на Delphi например, позволява да пишеш глупости, т.е. невалидни инструкции, които както казаха тука, се кодират в кой знае какво...

Освен това, май найстина не зареждаш правилно адреса, използвай lea...
Дори (не съм сигурен че ще стане коректно, не мога да пробвам в момента) но с lea може да си направиш и сметката. Спомням си, че преди много години MS C компилатора генерираше lea инструкции, за да представи сметне по-проста аритметична операция...
---
...и аз пиша на кирилица!

Редактирано от ess на

Отговор
в отговор на ess #7

Re: asm

za bazowiq adres na masiwa spor nqma siguren sum 4e e pravilno.
t.e ako zadelam w steka :

mov ebx, [pArray] ili lea ebx, pArray

ako zadeleam s heap-a s HeapAlloc da re4em to togawa:

mov ebx, pArray

A ina4e run-time error v smisul 4e nqmam razre6enie da pi6a na tozi adres.

May Colombino e praw za indeksnite registri mislq 4e ottam idwa problema.

Отговор
в отговор на лor #8

Re: asm

Ам тъй, де...ти така и не каза, на какво го пишеш, но както казах, карал съм Delphi-то да генерира "странни" инструкции...

[offtopic]Ох...как ми се пише на асемблер, но напоследък няма време...[/offtopic]
---
...и аз пиша на кирилица!

Редактирано от ess на

Отговор
в отговор на лor #9

Re: asm

Дизасемблирай си резултатния обектен код и виж каква инструкция ти е генерирал асемблера.

"Всички науки са или физика, или колекциониране на пощенски марки." (Е. Ръдърфорд)
Отговор
в отговор на ess #10

Re: asm

_asm

{
push edi
....
// use and modify edi
...
pop edi
};

Отговор
в отговор на Mинaвaщ #11

Re: asm

kakto sme na tema za assembler edno drugo ne6to.
Zna4i poprincip rqdko izpolzwam __asm{ ... }
Obiknoweno pi6a cqlata programa na assebmler (ako e po malka) ili s custom build compiliram w otdelni moduli ot *.asm. Ta stava vupros nqkoi pisal li e DLL s export-irani funkcii na assebmler i da vika tezi funkcii (implicitly) ot c++ programa ?
Imam problem s dekoriranite imena na assembler i C++; ima razli4iq i linker-a ne girazpoznawa pri import.

Отговор
в отговор на log #12

Re: asm

extern "C"

--
Екстремно програмиране на български.
[линк]
Отговор
в отговор на ZZ #14

Re: asm

това дето го казваш е вярно само за някои асемблери, а за тези за които важи зависи как е декларирано pArray

Отговор
в отговор на xp #15

Re: asm

уууу това е строго забранено в EULA-та

Отговор