mikrocontroller.net

Forum: PC-Programmierung C/C++ Parameterübergabe in ebx


Autor: Thomas W. (thomas_v2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

gibt es spezielle Konstrukte bei denen ein C/C++ Programm welches mit 
dem msvc++ übersetzt wurde, Parameter einer Funktion im Register ebx 
übergibt?

In den Dokumentationen habe ich darüber nichts finden können, mir liegt 
aber ein Programm vor bei dem ich so etwas vermute.

Autor: Oliver S. (oliverso)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Thomas W. (thomas_v2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oliver S. schrieb:
> 
https://docs.microsoft.com/en-us/cpp/cpp/argument-passing-and-naming-conventions?view=vs-2017
>
> Oliver

Das habe ich schon gelesen, aber laut der Dokumentation wird ebx nie zur 
Parameterübergabe verwendet. Wenn dann nur ecx und/oder edx je nach 
Aufrufkonvention wie fastcall.

Ich habe aber ein Assemblat vorliegen, in dem innerhalb einer Funktion 
einer anderen Funktion mit Parameterübergabe über den Stack wie memset, 
über push ebx ein Parameter auf dem Stack übergeben wird, aber ebx 
innerhalb der Funktion weder beschrieben, noch im Prolog auf dem Stack 
gesichert wird.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thomas W. schrieb:
> In den Dokumentationen habe ich darüber nichts finden können, mir liegt
> aber ein Programm vor bei dem ich so etwas vermute.

Konkreter ASM-Code?

Sicher, dass es von C/C++ Code kommt?

Autor: Hdudzevdjfd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
RVO? Return value optimization vllt.

Autor: Thomas W. (thomas_v2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
A. K. schrieb:

> Konkreter ASM-Code?
>
> Sicher, dass es von C/C++ Code kommt?

Die Stelle an der in der besagten Funktion ebx zum erstem Mal verwendet 
wird ist die folgende:
push    80              ; size_t
push    0               ; int
push    ebx             ; void *
call    memset

Die gesamte Funktion ist etwas umfangreicher, zumindest wird bis dahin 
ebx weder gelesen noch geschrieben. Bevor die Funktion aufgerufen wird 
aber schon mit "lea ebx, locale_var", was auch einen Sinn ergeben würde. 
Nur ist das in den Beschreibungen zu den Parameterübergaben nirgends so 
beschrieben.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es bringt nichts, nur jenen Code zu posten, in dem die Frage nicht 
aufgeworfen wird.

: Bearbeitet durch User
Autor: Thomas W. (thomas_v2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also denn:
sub_xxxxxx

push    ebp
mov     ebp, esp
mov     eax, 12C4h
call    sub_xxxxxx
mov     eax, dword_xxxxxx
xor     eax, ebp
mov     [ebp+var_4], eax
mov     eax, [ebp+arg_0]
push    esi
mov     esi, [ebp+arg_4]
and     eax, 0FF00h
push    edi
mov     edi, [ebp+arg_8]
mov     [ebp+var_12A0], edx
mov     edx, [ebp+arg_C]
or      eax, 10010h
push    ecx
mov     [ebp+var_12A4], ecx
mov     [ebp+var_129C], esi
mov     [ebp+var_1294], edi
mov     [ebp+var_1298], edx
mov     [esi+8], eax
mov     dword ptr [esi+0Ch], 0
call    sub_xxxxxx
mov     eax, [esi+8]
and     eax, 0FF00h
mov     dword ptr [edi+0Ch], 0
or      eax, 10001h
mov     [edi+8], eax
mov     ecx, 7
mov     esi, offset xxxxxx
lea     edi, [ebp+var_12C4]
rep movsd
movsw
push    1Eh
lea     ecx, [ebp+var_12C4]
push    ecx
push    0
movsb
call    sub_xxxxxx
lea     edx, [ebp+var_1C]
push    18h
push    edx
call    sub_xxxxxx
mov     esi, [ebp+var_1294]
lea     eax, [ebp+var_1C]
push    eax
call    sub_xxxxxx
push    80              ; size_t
push    0               ; int
push    ebx             ; void *
call    memset
Es lässt sich auch nur sehen, dass ebx bis zum memset in der Funktion 
nicht verwendet wird.

Autor: Jim M. (turboj)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thomas W. schrieb:
> anderen Funktion mit Parameterübergabe über den Stack wie memset,
> über push ebx ein Parameter auf dem Stack übergeben wird, aber ebx

Sieht für mich eher so aus als hätte da der Optimizer seine Arbeit 
getan.

Ohne den C/C++ Source kann man da aber recht wenig zu sagen.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Im Funktionsprolog
  push    ebp
  mov     ebp, esp
  mov     eax, 12C4h
  call    sub_xxxxxx
wird in der dort aufgerufenen Funktion Platz auf dem Stack für 12C4h 
Bytes an lokalen Variablen reserviert, die relativ zu EBP adressiert 
werden. Es werden dort sicherlich auch ein paar Register gesichert. Das 
ist keine C-Funktion, sondern eine zum Compiler gehörende Hilfsfunktion. 
Möglicherweise liefert die dein EBX.

: Bearbeitet durch User
Autor: Thomas W. (thomas_v2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Funktion die da aufgerufen wird ist alloca_probe, fasst aber ebx 
nicht an.

Dass der Compiler den Code so gut optimiert wäre eine Möglichkeit, aber 
dann könnte der Compiler ja immer wenn möglich andere Register zur 
Parameterübergabe verwenden.
Was dort in ebx übergeben wird ist vermutlich ein Zeiger auf eine 
struct, und es wird noch ca. 10 mal schreibend indirekt darauf 
zugegriffen.

: Bearbeitet durch User
Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die meisten C++ Compiler, die ich kenne, benutzen ebx als selfpointer. 
Es ist also durchaus wahrscheinlich, dass der in einer Funktion gar 
nicht verwendet wird. Im Kontext sollte das aber klar werden.
Lass mal die freie IDA Version über deinen code laufen. Dann bekommst du 
einige Hinweise.

Thomas

Autor: Nochn Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der this-Zeiger wird beim msvc++ in ecx übergeben, siehe:

https://docs.microsoft.com/en-us/cpp/cpp/thiscall?view=vs-2017

ebx wird laut Wikipedia nur von einem Watcom Compiler zur 
Parameterübergabe verwendet.

Autor: tictactoe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe ich auch schon mal beobachtet, nachdem der Optimizer seine Arbeit 
getan hat. Natürlich passiert das nur bei Aufrufen innerhalb eines EXEs 
oder einer DLL, nicht über solche Grenzen hinweg.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.