[MASM] Beginnersvraag(en)

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • kitao
  • Registratie: Juli 2012
  • Laatst online: 03:59
Modbreak:Deze thread is afgesplitst vanuit [C++] Programmeren Beginnersvraag(en)


Inleiding :
Sinds begin dit jaar begonnen met het weer oppakken van micro-elektronica waarbij enige kennis van programmeren handig is. Vanuit de arduino omgeving besloten C++ proberen beter te begrijpen maar omdat dit een hogere programmeertaal is ben ik daarnaast bezig met assembly dat naar ik verwacht een iets beter inzicht geeft van wat er 'onder de motorkap' gebeurt, hoewel dit nog afwachten is.
Voordat ik met dat laatste begon had ik eerst al het C++ topic geopend en op mijn verzoek is dat topic nu gesplitst, zie de modbreak bovenaan.
Dit omdat tweakers met kennis van Masm misschien niet zo gauw in een C++ zullen gaan kijken.
Daarbij wel opgemerkt dat C++ en Masm naast elkaar gecombineerd in één IDE zoals Visual Studio gebruikt kan worden waarbij de ene file naar de andere overgaat, meer daarover valt in deze tutorial serie te zien en zal ook terug te vinden zijn in sommige posts van het eerste topic.

YouTube: x64 Assembly and C++ Tutorial 0: Setting Up x64 Assembly in Visual S...

De beide topics zitten daarom op bepaalde punten samengevlochten en door deze splitsing begint het aanvankelijk nogal onoverzichtelijk. Zal proberen vanaf nu zoveel mogelijk een scheiding aan te houden hoewel ik ergens ook hoop niet teveel gebruik te hoeven maken van dit topic want dat betekent dat ik dan behoorlijk vast ben gelopen. Ook anderen zijn natuurlijk hartelijk welkom hier hun vragen te stellen, uiteraard.

Tot zover de inleiding en om 'simpel' te beginnen kan meteen doorgestapt worden naar mijn 15 februari post hieronder en de rest voorlopig even overgeslagen worden, dat zijn meer mijn ervaringen om masm in VS17 draaiend te krijgen.

kitao in "[MASM] Beginnersvraag(en)"


***********************************

Ik heb twee programma's voor assembly, Visual Studio en Visual Masm, zie vorige post of deze website http://www.visualmasm.com/ en ben lang bezig geweest om te proberen codes voor VM op VS te laten draaien maar dat bleek helaas een mislukte tweak poging.
Ten eerste kwamen er toch problemen na het installeren van VM, namelijk het (weer) opduiken van het fatale blauwe scherm waardoor de computer na iedere ca. 10 minuten van geen toetsenbord activiteit zichzelf uitschakelde en opstartte, (event 41 kernel-power).
Updates opvragen van windows gaf hier uiteindelijk een oplossing voor en hopelijk blijft dat zo.
Ander punt dat niet al te soepel ging was het laten draaien van Kip Irvine op VS.
http://kipirvine.com/asm/gettingStartedVS2017/index.htm
Daar bleek uiteindelijk een niet aanwezige SDK(10.x) op VS de oorzaak van te zijn, deze staat er inmiddels op en is positief getest met één van zijn voorbeelden. Aan die website heb je trouwens niet zoveel zonder dit boek erbij, Assembly Language for x86 Processors, dat niet goedkoop is. Vreemd genoeg blijkt die ook bovenaan de zoekresultaten te staan in gratis pdf vorm.

Terug naar de mislukte tweak, ik heb onderstaand programmaatje gevonden op
http://win32assembly.programminghorizon.com/tutorials.html
Draait wel op VM , niet op VS. En zo te zien ligt het probleem bij de includes, niet bij de libs.

Afbeeldingslocatie: https://i.imgur.com/Zk08O6Q.jpg

Heb op internet suggesties bekeken maar vermoed inmiddels dat het niet compatible is met elkaar, alsof je met een kurketrekker een schroef uit een plank wil draaien. Of mis ik iets en is hier wel een niet al te ingewikkelde oplossing voor ? En ps, ik vraag niemand om zelf in dit doolhof te stappen maar mss als iemand zoiets eerder heeft geprobeerd en die zonder veel moeite hier richting aan kan geven zou welkom zijn.

[ Voor 35% gewijzigd door .oisyn op 15-02-2019 17:02 ]


Acties:
  • 0 Henk 'm!

  • kitao
  • Registratie: Juli 2012
  • Laatst online: 03:59
Vervolg vorige post (5 dagen later)

Wou even laten weten dat de vraag in vorige post is opgelost. Enige wat nog ontbreekt is een verklaring want hoe het komt heb ik geen idee van. Al paar dagen zitten schuiven en directories in paths zitten te includen en verplaatsen van hoofdmappen naar en van program files(x86), tientallen webpublicaties bekeken en ineens werkt het nu wel. En dat zonder extra instellingen in visual studio erin te zetten. Of die zitten nog ergens verborgen zonder dat ik het weet.
Maar goed, wat dus wel schijnt te werken :
Volg deze video om een Masm-template in VS te maken
YouTube: Assembly Tutorial: Compiling Your First Assembly Program Using Visu...
Dan File-New-Project
Klik op de template Masm en klik ok.
In solution explorer dubbelklik op main en verwijder het programmaatje wat daar staat.
Plak er een masm32 code in en klik op run.

Dan krijg je bijv. dit :

Afbeeldingslocatie: https://i.imgur.com/GaurfrZ.png?1
klik voor groter en scherper beeld

Rode pijltje wijst naar de window die het programma als output geeft.
Dit programma voorbeeld komt dan van een Alan Phipps assembly tutorial maar is niet de enige die ik heb getest. Ook die van Iczelion draaien nu ineens wel goed. Terwijl ik al het bovenstaande volgens mij toch al eerder had geprobeerd.
Afin, 'het' doet het, maar oorzaak onbekend hoewel ik inmiddels wel iets meer te weten ben gekomen over paths en includen.

Ps/ de syntax highlighting zit niet standaard in VS voor .asm projecten, dat komt van een extensie AsmDude.
Ps2/ Hoewel er achteraf gezien dus blijkbaar helemaal geen extra project properties instellingen nodig waren is het mss handig te weten dat bijvoorbeeld veldjes veranderen zoals 'include directories' enkel invloed hebben op het openstaande project. Het heeft gelukkig geen invloed op de 'overall' instellingen waar VS op draait, waar ik eerst wel huiverig voor was. Dat betekent dus dat er vrij mee geexperimenteerd kan worden zonder dat de hele software de soep in draait.
Ps3/ Toen het wel lukte had ik asmdude verwijderd. Daarna weer terug gezet maar leek erop geen verschil te maken. Lastig om nog precies te achterhalen waarin het verschil heeft gezeten.
Ps4 \masm32\include\windows.inc schijnt altijd bovenaan te moeten staan
Ps5\ Dit includen lukt natuurlijk alleen als masm32 eerst is gedownload via http://www.visualmasm.com/ , zie vorige posts.
Ps6/ Meer over includen, dit keer voor C++, zie deze video
YouTube: Let's Learn C++ ~ Basics: 8 of 14 ~ Additional Libraries Installati...
Het programma Boost wat erin vermeld wordt is wel fors , circa 600-700 MB.
Lees ook de reacties onder de video, draaide bij mij namelijk niet meteen.
Bleek ook verschil te maken of er in het path bijvoorbeeld een \ achter include werd geplaatst of niet.

Ps7\
@.oisyn
Misschien kan je de titel van dit topic wijzigen tot C++ en Masm assembly beginnersvragen o.i.d ?

Ps8\ ************************** een dag later ****************************

Nog een meevaller. En ik zou dit normaal gesproken niet vermelden maar voert terug op een vorige post waarin ik 18 stappen beschreef om visual studio aan de praat te krijgen.
Blijkt namelijk ook in 5 stappen te kunnen en wil niemand verkeerde info geven, vandaar deze aanvulling.
Eigenlijk zijn het 4 stappen omdat stap 1 slechts eenmalig hoeft te worden uitgevoerd, die zit er dan ingebakken ahw.

1. Volg deze video om een Masm-template in VS te maken
YouTube: Assembly Tutorial: Compiling Your First Assembly Program Using Visu...
2. Dan File-New-Project, Klik op de template Masm en klik ok.
3. In solution explorer dubbelklik op main.asm en verwijder het programmaatje wat daar staat en zet er een andere assembly code in en selecteer x64 in het menuveldje bovenaan onder tools en test.
4. Vervolgens rechts klik in solution explorer op project en add - new item
Kies Header File (.h) en vul die in met code.
5. Vervolgens opnieuw add new item en kies C++ File (.cpp) en vul ook die in met code.

Voor wie het zelf wil proberen hier een geteste code voor resp .asm en .h en .cpp die mooi samen werken.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
; ************************** main.asm **********************
; uit deze video : 
; https://www.youtube.com/watch?v=ieuUHIWaIqM&list=PL0C5C980A28FEE68D&index=19

.code

Multiply PROC
    imul ecx, edx
    mov eax, ecx
    ret
    Multiply ENDP
    ;***********************
    Divide proc
    mov r8d, edx
    mov eax, ecx
    cdq
    idiv r8d
    mov eax, edx
    ret
    Divide endp
    ;**********************
    Remainder proc
    mov r8d, edx
    mov eax, ecx
    cdq
    idiv r8d
    mov eax, edx    
    ret
    Remainder endp
    end

// ************************* Header.h ******************
#pragma once
#ifndef ASM_ASM
#define ASM_ASM
// These are the prototypes of the 3 functions
extern "C"  int Multiply(int x, int y);
extern "C"  int Divide(int x, int y);
extern "C"  int Remainder(int x, int y);
#endif

//***************** source.cpp code ******************
#include <iostream>
#include "Header.h" // Header for our procedure
using namespace std;
int main()
{
    int x, y;

    for (;;)
    {
        cout << "Input a number (0 for exit) :  ";
        cin >> x;
        if (x == 0) break;

        cout << "Input an other number (0 for exit) :  ";
        cin >> y;
        if (y == 0) break;

        cout << x << " * " << y << "   =   " << Multiply(x, y) << endl;
        cout << x << " / " << y << "   =   " << Divide(x, y) << endl;
        cout << x << " % " << y << "   =   " << Remainder(x, y) << endl;
    }
    cout << endl << endl;
    system("pause");
}

Nu dit alles stukken beter gaat (na ruim een maand aanrommelen) hoop ik dat er meer tijd vrij komt voor het programmeren an sich. Mocht ik daarbij ergens vastlopen dan keer ik hier graag terug.
Tot dan :)


Ps\ 9
Toch nog problemen mee gehad, wou namelijk onderstaand korte programmaatje via bovenstaande MASM template laten draaien maar gaf LNK2001 unresolved external symbol mainCRTStartup error. Ga je daarnaar op internet zoeken zit je meteen in doolhof.
Oplossing zelf verzonnen :

Er moet een main.cpp file aanwezig zijn, in dit geval leeg laten, dus via Project-Add New Item een main.cpp erbij maken.
En via template MASM heb je main.asm, dat geeft conflict als er een main.cpp is.
Rename main.asm naar asm.asm en je hebt er geen last van.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
; Dit draait alleen in x64 modus

ExitProcess proto

.data
sum qword 0

.code
main proc
    mov   rax,5
    add   rax,6
    mov   sum,rax

    mov   ecx,0
    call  ExitProcess
main endp
end

[ Voor 62% gewijzigd door kitao op 14-02-2019 17:09 . Reden: Ps\1-8 + Ps\9 ]


Acties:
  • 0 Henk 'm!

  • kitao
  • Registratie: Juli 2012
  • Laatst online: 03:59
[Masm] Vraag over EQU en PUSH combinatie.

Kwam een programma tegen, linkje hieronder, dat zonder problemen draait op Visual Masm maar een error geeft op Visual Studio 2017.

https://www.alanphipps.ne...s/IT_Assembler_Tutorial07

Hier loopt VS17 op vast :

code:
1
2
3
4
5
6
7
8
.data

txtString DB "123456789", 0
len1 Equ $ - txtString

.code

Push len1

En geeft Error A2070 invalid instruction operands

Heb een aantal dingen geprobeerd die niet werken, zoals
- len1 Equ ($ - txtString)
- len1 Equ <$ - txtString>
- len1 Equ $ - txtString verplaatst naar .code en .constant segment
- len1 van naam wijzigen tot bijv. blok1
- paar uurtjes internet doorzoeken, etc.

Wat het wel doet
- In .data de Equ regel verwijderen en in .code de regel veranderen tot Push 10
- Of in .data de regel veranderen tot len1 equ 10

Probleem lijkt m.i. dus echt in dit gedeelte te zitten : $ - txtString
Maar kan niet zo gauw vinden waarom want bijvoorbeeld ook hier lijkt dat als een geldige instructie te worden voorgesteld :
We can store the string length explicitly by using the $ location counter symbol that represents the current value of the location counter. In the following example −

msg db 'Hello, world!',0xa
len equ $ - msg

$ points to the byte after the last character of the string variable msg. Therefore, $-msg gives the length of the string. We can also write :

msg db 'Hello, world!',0xa
len equ 13
https://www.tutorialspoin...ming/assembly_strings.htm

Hoewel het programma toch draaiend is gekregen vermoed ik deze error vaker tegen te zullen komen en zou gauw willen weten hoe dit zo te wijzigen dat 'naam' Equ $ - string toch gebruikt kan worden.
Alvast bedankt.
.oisyn schreef op vrijdag 15 februari 2019 @ 16:05:
Ik heb de masm posts even verplaatst naar een apart topic: [MASM] Beginnersvraag(en)
Hartelijk dank daarvoor :)

[ Voor 6% gewijzigd door kitao op 15-02-2019 16:16 ]


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 02:51

.oisyn

Moderator Devschuur®

Demotivational Speaker

@kitao Misschien kun je de eerste post voorzien van een inleiding? Het valt een beetje uit context zo :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • kitao
  • Registratie: Juli 2012
  • Laatst online: 03:59
.oisyn schreef op vrijdag 15 februari 2019 @ 16:17:
@kitao Misschien kun je de eerste post voorzien van een inleiding? Het valt een beetje uit context zo :)
Heb een inleiding erbij gezet, beetje lang misschien maar hopelijk wel duidelijk.
En om één of andere reden is jouw Modbreak regel bovenaan van kleur verschoten ?
Sorry, krijg het zo snel even niet meer goed.

Acties:
  • 0 Henk 'm!

  • Daos
  • Registratie: Oktober 2004
  • Niet online
equ is geen instructie voor de processor, maar voor de assembler. len1 krijgt tijdens uitvoeren van assembler de uitkomst van die berekening en die uitkomst wordt in de code gezet waar je len1 gebruikt. Je tutorial is voor nasm. Kans is groot dat het voor masm net iets anders werkt (hoe dan wel weet ik zo niet uit mijn hoofd)

[ Voor 4% gewijzigd door Daos op 15-02-2019 18:36 . Reden: Niet goed gelezen ]


Acties:
  • 0 Henk 'm!

  • kitao
  • Registratie: Juli 2012
  • Laatst online: 03:59
Daos schreef op vrijdag 15 februari 2019 @ 18:08:
equ is geen instructie voor de processor, maar voor de assembler. len1 krijgt tijdens uitvoeren van assembler de uitkomst van die berekening en die uitkomst wordt in de code gezet. Je tutorial is voor nasm. Kans is groot dat het voor masm net iets anders werkt (hoe dan wel weet ik zo niet uit mijn hoofd)
Je tutorial is voor nasm

Ja en nee.
Er staan een paar tutorials in mijn posts en het klopt inderdaad dat die van Tutorialspoint voor nasm is gemaakt, zoals hier beschreven staat :
We will use the NASM assembler
https://www.tutorialspoin...bly_environment_setup.htm

Maar voordat ik daarin het equ voorbeeld vond, was ik hetzelfde al tegengekomen in een pdf van dit boek : Assembly Language for x86 Processors, van Kip Irvine.
Omdat waarschijnlijk de pdf daarvan niet legaal is zet ik daarvan geen link. Maar wat ik wil zeggen is dat diezelfde len1 equ $-string instructie ook in masm wordt toegepast aangezien dat boek volledig gebruik maakt van Visual Studio.
Een aantal zaken zijn verwarrend en dienen uit elkaar gehouden te worden dat in dit topic niet volledig duidelijk is geworden, mede vanwege de afsplitsing van het c++-topic (en sowieso al onduidelijk was in het originele c++ topic).

Er is o.a. de x64 tutorial serie van assembly (The Creel i.c.m. C++ , en die van Irvine) die gebruik maken van Visual Studio en er zijn o.a. de masm32 series (Alan Phipps en Iczelion) die Visual Masm (VM) gebruiken.

http://www.visualmasm.com/

Beide serie-versies heb ik inmiddels draaiend gekregen in VS17 maar met name die laatste met veel plakband, lijm, kunst en vliegwerk en met een waarschijnlijk niet-reproduceerbare dosis toeval bij het in de wilde weg schieten. De code die genoemd wordt in de post hierboven

https://www.alanphipps.ne...s/IT_Assembler_Tutorial07

geeft maar liefst 11 warnings in VS17, zelfs als die wel compileert, maar draait zonder problemen op VM.
Kan dus best zo zijn dat diezelfde instructie helemaal geen probleem oplevert bij mensen die masm32 op een andere manier hebben geinstalleerd op VS17. Maar ja, dat weet ik dus niet, ik moet het hiermee doen.
Nadeel van de VM-ide is namelijk het gestuntel met het opslaan en openen van gemaakte projecten en bovendien wou ik proberen of dit ook op VS17 draaibaar is te krijgen, hetgeen dus wel gebleken is dat dit mogelijk is, maar blijkbaar vergezeld van nogal wat haperingen en beperkingen. Op zich is gebruik maken van enkel VM voor de masm32 tutorial-serie best te doen als je wat geoefend hebt met de manier van saven en openen en kan iemand, die geen tijd of zin heeft om VM al tweakend bij VS17 erin te bakken, deze stap overslaan. Daarmee zal dan waarschijnlijk echter geen antwoord gegeven kunnen worden op mijn vraag dat juist gaat over de integratie tussen VM en VS17, (masm32 on visual studio) , dat zover ik achteraf gezien heb niet helemaal uniek is maar wel behoorlijk zeldzaam en/of verouderd is. Kan zijn dat bij nadere bestudering hier toch meer info over in staat als dat ik aanvankelijk kon begrijpen.

Trouwens bedankt voor je toelichting op het wijzen tussen het verschil instructie assembler en processor, iets wat ik nog niet eerder was tegengekomen.
En bij nader inzien heb je mss toch gelijk, ik zie nu pas dankzij jouw reactie, dat in de Irvine-pdf over het Equ gedeelte in hoofdstuk 3 niet exact hetzelfde staat als in Tutorialspoint, daarnaast wordt namelijk ook dit genoemd :

myString_len = ($ − myString)
en
name TEXTEQU <text>
name TEXTEQU textmacro
name TEXTEQU %constExpr


Zal dat morgen eens proberen.

[ Voor 19% gewijzigd door kitao op 15-02-2019 23:55 ]


Acties:
  • 0 Henk 'm!

  • Daos
  • Registratie: Oktober 2004
  • Niet online
Bij mij werkt (de equ in) je eerste voorbeeld gewoon. In je tweede voorbeeld is 0xa niet geldig in masm. Daar schrijf je hexadecimale constantes als 0ah of 0Ah.

edit:
Grrr. Hij valt over de push, niet de equ.

edit2:
Als workaround kan je len1 eerst in een register stoppen en die pushen. Dat werkt blijkbaar wel.
code:
1
2
    mov rax, len1
    push rax

[ Voor 43% gewijzigd door Daos op 16-02-2019 00:05 ]


Acties:
  • 0 Henk 'm!

  • kitao
  • Registratie: Juli 2012
  • Laatst online: 03:59
Daos schreef op vrijdag 15 februari 2019 @ 23:56:
Bij mij werkt (de equ in) je eerste voorbeeld gewoon. In je tweede voorbeeld is 0xa niet geldig in masm. Daar schrijf je hexadecimale constantes als 0ah of 0Ah.

edit:
Grrr. Hij valt over de push, niet de equ.

edit2:
Als workaround kan je len1 eerst in een register stoppen en die pushen. Dat werkt blijkbaar wel.
code:
1
2
    mov rax, len1
    push rax
Bedankt voor de tip, dat 0xa niet geldig is in masm wist ik nog niet. Had die variant trouwens wel eerder geprobeerd maar niet vermeld. Over workaround gesproken, heb net als jij een omweg toe kunnen passen, zie de eerdere post. Zal een stukje daarvan herhalen voor het overzicht :

********************************************************************************

Hier loopt VS17 op vast :
code:
1
2
3
4
5
.data
txtString DB "123456789", 0
len1 Equ $ - txtString
.code
Push len1

En geeft Error A2070 invalid instruction operands

Heb een aantal dingen geprobeerd die niet werken, zoals
- len1 Equ ($ - txtString)
- len1 Equ <$ - txtString>
- len1 Equ $ - txtString verplaatst naar .code en .constant segment
- len1 van naam wijzigen tot bijv. blok1

Wat het wel doet
- In .data de Equ regel verwijderen en in .code de regel veranderen tot Push 10
- Of in .data de regel veranderen tot len1 equ 10

Probleem lijkt m.i. dus echt in dit gedeelte te zitten : $ - txtString

************************************************************************************

Dankzij jouw opmerking over het verschil tussen Nasm en Masm nog eens beter naar Equ en Textequ gekeken in de pdf van Irvine. Heb een paar dingen geprobeerd met Textequ en wat wel blijkt te lukken is deze :

code:
1
2
3
4
5
.data
txtString DB "123456789", 0
len1 TEXTEQU %($ - txtString)
.code
Push len1

https://i.imgur.com/kNUBwR8.png

Het blijft evengoed aanpassen maar is hopelijk een kleinere omweg dat m.i. de programmaflow minder wijzigt en dichter bij het origineel blijft.
Dus nogmaals bedankt, ik beschouw deze vraag als opgelost. :)

Ik weet nu nog niet precies waarom len1 Equ $ - txtString wel in Visual Masm lukt en niet in VS17 maar hoef niet alles tot in de puntjes uitgezocht te hebben, sommige dingen zijn nu eenmaal zo en kan hier voorlopig mee verder.
.

[ Voor 1% gewijzigd door kitao op 16-02-2019 09:47 . Reden: plaatje toegevoegd ]


Acties:
  • 0 Henk 'm!

  • Daos
  • Registratie: Oktober 2004
  • Niet online
Zoals ik al schreef: het is de push waar VS17 over valt. Je kan dubbel-klikken op de foutmelding en dan zie je dat.

Mijn theorie waarom het niet werkt in de VS17 en wel in Visual Masm is dat de eerste een 64-bits programma maakt en de tweede een 32-bits programma. Er bestaat namelijk wel een push om een 32-bits getal (heet immidiate in assembly) te pushen, maar niet om dat te doen bij een 64-bits getal.

Misschien kan je uitzoeken of je in kan stellen of je 32-bits of 64-bits wilt hebben.

Acties:
  • 0 Henk 'm!

  • kitao
  • Registratie: Juli 2012
  • Laatst online: 03:59
Daos schreef op zaterdag 16 februari 2019 @ 14:35:
Zoals ik al schreef: het is de push waar VS17 over valt. Je kan dubbel-klikken op de foutmelding en dan zie je dat.

Mijn theorie waarom het niet werkt in de VS17 en wel in Visual Masm is dat de eerste een 64-bits programma maakt en de tweede een 32-bits programma. Er bestaat namelijk wel een push om een 32-bits getal (heet immidiate in assembly) te pushen, maar niet om dat te doen bij een 64-bits getal.

Misschien kan je uitzoeken of je in kan stellen of je 32-bits of 64-bits wilt hebben.
Ik kan ze allebei instellen. Is ook nodig omdat de 'calling convention' tamelijk anders is tussen die twee, en ik weet nu niet precies of dat de juiste term is maar als voorbeeld de 32 bit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
0; Assembly Language for x86 Processors - Kip Irvine

1: ; AddTwo.asm - adds two 32-bit integers 
4: .386
5: .model flat,stdcall
6: .stack 4096
7: ExitProcess PROTO, dwExitCode:DWORD
9: .code
10: main PROC
14: INVOKE ExitProcess,0
15: main ENDP
16: END main

en de 64 bit, en daar zit nogal verschil in.
code:
1
2
3
4
5
6
7
8
9
1: ; AddTwoSum_64.asm - Chapter 3 example.
3: ExitProcess PROTO
5: .data
6: sum DWORD 0
8: .code
9: main PROC
15: call ExitProcess
16: main ENDP
17: END

Dacht achteraf nog aan je vorige post toen je het over een rax had, terwijl visual masm zover ik weet enkel op 32 draait ? Masm32 zie je dan vaak staan maar ik moet eerlijk bekennen dat ik weinig snap van de tutorials van genoemde alan phipps en iczelion hoewel het iedere keer een stukje minder vaag wordt. Zou het echter niet aanraden voor iemand die net als ik pas begint om enkel bij die voorbeelden te blijven. Aan de andere kant, hun programma's draaien meestal wel dus dat is enkel een kwestie van kopie/plakken en best leuk om te proberen. Werd pas (voor mij) een probleem om visual masm32 op VS17 'over te zetten' maar gaat na opstartproblemen ook best aardig. Met soms van die rare dingen erbij dat ineens één onderdeeltje niet pakt.

Of dit aan Push ligt weet ik niet, kan zelf namelijk niet verklaren waarom al die andere Pushs het wel doen en de Push die vanuit Equ kwam de boel weigert ? Maar heb inderdaad dubbelgeklikt op de error en dan kwam ik uit bij de regel met Push len1 maar dat is inmiddels opgelost, hoewel oorzaak onbekend.
Heb hieronder nog twee snip plaatjes gezet van hoe bij mij VS17 ingesteld staat voor 32- en 64-bit, dit enkel ter illustratie.

https://i.imgur.com/xwzJOsu.jpg

https://i.imgur.com/rGoYd5X.png
.

[ Voor 3% gewijzigd door kitao op 17-02-2019 00:02 ]


Acties:
  • +1 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 12-07 11:40

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

  • kitao
  • Registratie: Juli 2012
  • Laatst online: 03:59
Daos schreef op zaterdag 16 februari 2019 @ 14:35:

Misschien kan je uitzoeken of je in kan stellen of je 32-bits of 64-bits wilt hebben.
Daar vandaag mee bezig geweest. Tot nu toe bleven configuratie wijzigingen niet opgeslagen bij afsluiten van VS17 en keerde alles terug naar fabrieksinstellingen, (default) maar zit volgens mij toch een uitzondering op.
Heb het samengevat en mocht iemand de stappen willen navolgen lees dan eerst deze post tot het einde.

Overschakelen tussen x64 en 32-bits (x86), door even dat knopje te veranderen blijkt niet voldoende te zijn.
Voor diegeen die Masm ook wil proberen, met Visual Studio, hier nog eens de benodigde stappen, zo kort mogelijk.
Opzetten van x64, (zie ook de OP)

1. File >> New >> Project >> Empty Project >> Geef het een naam, bijv. Sum64.
2. Taakbalk bovenin >> Project >> Add new item >> C++-file >> geef het een naam, bijv. main.cpp
Die moet aanwezig zijn, zelfs als die leeg blijft.
3. Taakbalk bovenin >> Project >> Add new item >> C++-file >> geef het een naam, bijv. asm.asm
Naam moet eindigen op .asm en mag niet ook main heten, anders conflict.
4. Taakbalk onder Tools en Test, verander keuzeveldje van x86 naar x64, zie dit plaatje :

Afbeeldingslocatie: https://i.imgur.com/ofXjzfa.png

5. In Solution Explorer rechtsklik op Sum64 >> Build dependacies >> Build costumizations >> vink masm(targets) aan.
6. In Solution Explorer rechtsklik op asm.asm >> Properties >> Item Type veranderen naar Microsoft Macro Assembler
7. Zet in asm.asm een x64 programma erin, bijv. die hieronder en moet het dan doen.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
ExitProcess proto
.data
sum qword 0
.code
main proc
    mov   rax,5
    add   rax,6
    mov   sum,rax
    mov   ecx,0
    call  ExitProcess
main endp
PUBLIC main
end

Maar wil je nu vanuit diezelfde omgeving/configuratie er een 32-bit code erin zetten dan is het simpelweg omschakelen van veldje x64 terug naar x86 niet voldoende.
Zet je bijvoorbeeld de code hieronder erin dan komt er een LNK1221 error.
Mogelijke oplossing : Helemaal opnieuw beginnen maar dan zonder veldje op x64 te zetten, oftewel stap 4 overslaan.
Of :
8. In Solution Explorer rechtsklik op Sum64, >> Properties en bovenaan All Configurations kiezen en All Platforms.
9. In Solution Explorer rechtsklik op Sum64, >> Properties >> Linker >> System >> Subsystem >>
Windows(/Subsystem ....), zie plaatje voor stap 8 en 9.
10. Zet in asm.asm een x32 programma erin, bijv. die hieronder en moet het dan doen.

Afbeeldingslocatie: https://i.imgur.com/PtV4Zrc.jpg

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
; AddTwoSum.asm - Chapter 3 example.
.386
.model flat,stdcall
.stack 4096
ExitProcess proto,dwExitCode:dword
.data
sum dword 0
.code
main proc
    mov eax,5               
    add eax,6               
    mov sum,eax
    invoke ExitProcess,0
main endp
end main

Heb die omschakeling vandaag zelf gevonden, (en duurde gelukkig geen uren) en zal waarschijnlijk niet de enige methode zijn maar weet wel dat dit een compleet doolhof is, vooral voor beginners.
Hopelijk kan een ander met deze toelichting daardoor sneller van start.

En kom er nu achter dat sommige veranderingen bij heropstarten van VS17 toch zijn blijven 'hangen' , stap 8 blijft erin gebakken zitten maar stap 9 niet en moet een nieuw 32-bits project op Windows(/Subsystem ....) gezet worden.
Soort flipperkast geworden.
En bij masm32, dat eerder voorbij kwam, gaat het weer iets anders, hoewel daarbij het grootste probleem was om de libs van masm32 door VS17 te kunnen laten 'bereiken'.
Ik noteer dit want na een week is alles weer vergeten.

Nogmaals de hoofdpunten :
Er moet een main.cpp en een asm.asm aanwezig zijn.
Build - Dependencies moet op masm(targets) staan.
All configurations en All platforms aanzetten.
Bij een 32-bit code het veldje op x86 zetten en Subsystem windows kiezen.
Bij een 64-bit code het veldje op x64 zetten en Subsystem windows verwijderen, door Not set te kiezen.
asm.asm moet op Mic.Mac.Assembler staan.

Dit zijn aanwijzingen die een richting aangeven, het is geen wegenkaart in steen gebeiteld.
Schade aan software of computer is voor eigen risico, hoewel de boel niet zal ontploffen maar kan zijn dat door gewijzigde instellingen voorgaande opgeslagen projecten niet pakken.
Daarbij meteen de volgende tip, alvorens iets te veranderen maak er een snip van of noteer de oorspronkelijke instelling. Had mijn eigen advies namelijk niet opgevolgd omdat ik van mening was dat deze instellingen niet permanent zouden zijn maar heb me vergist, stap 8 is daar een voorbeeld van.
Heb ze enigzins kunnen herinneren en misschien ten tweede hier terug kunnen vinden :

Afbeeldingslocatie: https://i.imgur.com/JwiN1Id.jpg
YouTube: Assembly Tutorial: Compiling Your First Assembly Program Using Visu...

Dus ipv All configs en All platforms was dit Active(debug) en etc. , maar meen dat er oorspronkelijk Release bij mij stond aangegeven. Afin, hoe dan ook, met deze instructie video valt geen 64-bit programma mee op te starten.

Eventueel een ander 'pad' , dat ik later evt tegenkom, zal ik niet meer posten, wie er niet uitkomt kan mij dan eventueel een pm sturen. Zo merk ik nu bijvoorbeeld dat deze opmerking niet helemaal klopt :
Er moet een main.cpp en een asm.asm aanwezig zijn.
Door direkt asm.asm de naam main.asm te geven hoeft er geen main.cpp naast gezet te worden en kan die volledig weggelaten worden. Daarom is deze post niet meer als een indicatie.

Ps
Blijkt dat er in 64-bit wel een main.cpp aanwezig moet zijn, en in 32-bit hoeft dat niet persé.
Het is me althans nog niet gelukt om in 64-bit zonder een (lege) main.cpp de code draaiend te krijgen.

# farlane, bedankt voor de link, zoals je ziet doe ik hier maar wat zonder goed te begrijpen wat iedere keuze precies inhoudt. Maar ja, leek mij handiger om in ieder geval eerst het programma draaiend te krijgen.
.

[ Voor 11% gewijzigd door kitao op 09-03-2019 10:30 . Reden: Ps\ ]


Acties:
  • 0 Henk 'm!

  • kitao
  • Registratie: Juli 2012
  • Laatst online: 03:59
Liep vandaag tegen een hapering aan en wou er na een paar uurtjes tobben al bijna over posten maar was ineens vanzelf opgelost, dus heb de post weggegooid. Wel is het zo dat ik een code toen op een online compiler wou testen en moest hieraan terug denken :
.oisyn schreef op woensdag 9 januari 2019 @ 23:52:
[...]
De compiler explorer van Matt Godbolt: godbolt.org.
Ondersteunt tal van verschillende compilers en laat de gegenereerde assembly zien. Voor standard compliance kun je het beste de x64 trunc versie van GCC of Clang pakken (Clang produceert over het algemeen betere errormeldingen), maar wel zorgen dat je -std=c++17 opgeeft als argument voor de compiler (en -O2 of -O3 voor optimalisaties als je geïnteresseerd bent in de gegenereerde assembly)
Heb een niet-haperende code geprobeerd op de online compiler https://godbolt.org/ maar kreeg dit resultaat :

Afbeeldingslocatie: https://i.imgur.com/NNHI0Km.jpg

Compilation Failed staat er onder het keuzeveld rechts (nu niet zichtbaar dus)
Heb zelf even gezocht en kwam hier uit :

https://blog.kowalczyk.in...-gcc-clang-msvc-etc..html

To check which compiler is used:

Visual Studio _MSC_VER


Betekent dit dat ik de online compiler niet kan gebruiken voor 64-bits assembly ?
Die keuze staat er namelijk niet bij, het is gnuas-gcc óf llvmas-clang óf nasm ?

ps\
hier de code
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
; Summing an Array (SumArray_64.asm)
ExitProcess PROTO
.data
intarray QWORD 1000000000000h,2000000000000h
QWORD 3000000000000h,4000000000000h
.code
main PROC
mov rdi,OFFSET intarray ; RDI = address of intarray
mov rcx,LENGTHOF intarray ; initialize loop counter
mov rax,0 ; sum = 0
L1: ; mark beginning of loop
add rax,[rdi] ; add an integer
add rdi,TYPE intarray ; point to next element
loop L1 ; repeat until RCX = 0
mov ecx,0 ; ExitProcess return value
call ExitProcess
main ENDP
END

[ Voor 16% gewijzigd door kitao op 09-03-2019 18:32 ]


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 02:51

.oisyn

Moderator Devschuur®

Demotivational Speaker

Dat is geen nasm syntax. Masm code kun je niet door nasm gooien.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • kitao
  • Registratie: Juli 2012
  • Laatst online: 03:59
.oisyn schreef op zaterdag 9 maart 2019 @ 19:31:
Dat is geen nasm syntax. Masm code kun je niet door nasm gooien.
Bedankt voor het meekijken en het antwoord.
Had wel eerder gemerkt dat nasm en masm niet klikken.
Wist enkel niet wat dit gnuas-gcc óf llvmas-clang nou precies inhoudt.

In ieder geval, ik ga tzt verder zoeken naar een wel functionerende 64-bit masm online compiler.
Als die bestaan tenminste.

Acties:
  • 0 Henk 'm!

  • kitao
  • Registratie: Juli 2012
  • Laatst online: 03:59
De video hieronder begint over een boek waarvan de titel in de code staat.
Ben daar al tijdje mee bezig maar pas in hoofdstuk 5 moeten er libraries aan VS17 worden toegevoegd en dat was met Visal Masm toevoegen ook al een ramp. Dat is gelukt maar kan niet navertellen hoe.

De video duurt 7 minuten maar is zeker aan te raden voor wie dit ook wil proberen omdat het m.i. op internet niet zo makkelijk te vinden is welke stappen ondernomen moeten worden om libs toe te voegen. Daar valt ook amper met zelf proberen uit te komen zoals in de video zal blijken. Ik heb dat getest en de libs zijn nu included.

Toestemming nodig voor bekijken van YouTube

Op deze plek staat ingesloten content die van YouTube afkomstig is. Het tonen van deze inhoud kan ertoe leiden dat YouTube persoonlijke gegevens zoals je IP-adres verwerkt en/of cookies op jouw computer of ander apparaat zet. Hiervoor moet je eerst expliciet toestemming geven voor Sociale media.

Bekijk op YouTube
How To Set Up Irvine32 Library



Onderstaande code compileert en kan met een breakpoint op main doorstapt worden.
Nu is er 1 probleem, volgens mij zou dit programma de console window cmd moeten laten verschijnen en om input moeten vragen. Dat gebeurt niet, er verschijnt geen window en als ik zelf de cmd open gaat er ook niks verkleuren. Stappend door het programma gaat verder goed, ik zie registers veranderen etc. maar op regel 50 is het einde oefening. Press any key maar er is geen window om in te pressen.

Ik leg dit even aan de kant en morgen weer verder dus misschien wordt deze post eventueel nog ge-edit als dit gevonden is, of niet.
Ondertussen zijn tips alvast welkom natuurlijk. :)

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
;
; <<<<<<<  Pagina 170 van boek :  >>>>>>>>>>>>>

;Assembly Language for x86 Processors
;Seventh Edition
;KIP R. IRVINE

;5.4.4 Library Test Programs
;Tutorial: Library Test #1
; Library Test #1: Integer I/O (InputLoop.asm)
; Tests the Clrscr, Crlf, DumpMem, ReadInt, SetTextColor,
; WaitMsg, WriteBin, WriteHex, and WriteString procedures.

include Irvine32.inc
.data
COUNT = 4
BlueTextOnGray = blue + (lightGray * 16)
DefaultColor = lightGray + (black * 16)
arrayD SDWORD 12345678h,1A4B2000h,3434h,7AB9h
prompt BYTE "Enter a 32-bit signed integer: ",0

.code
main PROC
; Select blue text on a light gray background
mov eax,BlueTextOnGray
call SetTextColor
call Clrscr ; clear the screen
; Display an array using DumpMem.
mov esi,OFFSET arrayD ; starting OFFSET
mov ebx,TYPE arrayD ; doubleword = 4 bytes
mov ecx,LENGTHOF arrayD ; number of units in arrayD
call DumpMem ; display memory
; Ask the user to input a sequence of signed integers
call Crlf ; new line
mov ecx,COUNT
L1: mov edx,OFFSET prompt
call WriteString
call ReadInt ; input integer into EAX
call Crlf ; new line
; Display the integer in decimal, hexadecimal, and binary
call WriteInt ; display in signed decimal
call Crlf
call WriteHex ; display in hexadecimal
call Crlf
call WriteBin ; display in binary
call Crlf
call Crlf
Loop L1 ; repeat the loop
; Return the console window to default colors
call WaitMsg ; "Press any key..."
mov eax,DefaultColor
call SetTextColor
call Clrscr
exit
main ENDP
END main

************************* dag later ****************************

De niet-verschijnende console window is inmiddels in beeld, hier een snip ervan, het paarse is de window :

Afbeeldingslocatie: https://i.imgur.com/PQeLhre.jpg?1

Het blijkt dat de autheur een template heeft gemaakt en hoewel de locaties van de lib-include-paths zover ik gezien heb overeenkomen met bovenstaande video, zit er een iets andere schrijfwijze in van opgegeven path. Het template kan hier gevonden worden :

http://kipirvine.com/asm/gettingstartedvs2015/index.htm

Tutorial: Building a 32-Bit Assembly Language Program
If you have not already done so, Right-click here to download a zip file containing an up-to-date Visual Studio 2015 project that has been configured for assembly language.

Met VS2017 gaat dat ook. Wel jammer dat de eerder ge-installeerde syntax highlighter asmdude zo te zien een conflict heeft met de template versie terwijl dit via de video-opstelling niet zo was.
.

[ Voor 14% gewijzigd door kitao op 03-04-2019 09:22 . Reden: dag later ]

Pagina: 1