Benutzer-Werkzeuge

Webseiten-Werkzeuge


coding:nasm

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
coding:nasm [2025/04/28 18:42]
admin [Windows]
coding:nasm [2025/04/28 18:47] (aktuell)
admin [Calculator]
Zeile 156: Zeile 156:
 =====Windows===== =====Windows=====
  
-<code>+====Input/Output==== 
 + 
 +<code asm>
 ;;Assemble and link with ;;Assemble and link with
 ;nasm -fwin32 hello.asm ;nasm -fwin32 hello.asm
Zeile 167: Zeile 169:
 segment .data segment .data
  
-    msg: db "Enter your ID", 0xA, 0xD, 0  ; note the null terminator.+    msg: db "String eingeben", 0xA, 0xD, 0  ; null terminator.
     formatin: db "%s", 0                  ; for scanf.     formatin: db "%s", 0                  ; for scanf.
  
Zeile 192: Zeile 194:
  
    ret      ret  
 +</code>
 +
 +====Calculator====
 +
 +<code asm>
 +; Assemble and link with:
 +; nasm -f win32 calc.asm
 +; gcc -o calc calc.obj
 +
 +global _main
 +extern _scanf
 +extern _printf
 +
 +segment .data
 +    msg1 db "Enter first number: ", 0xA, 0
 +    msg2 db "Enter second number: ", 0xA, 0
 +    msg3 db "Enter operation (+, -, *, /): ", 0xA, 0
 +    formatint db "%d", 0
 +    formatchar db " %c", 0       ; Leerzeichen für scanf, damit Whitespaces ignoriert werden
 +    formatout db "Result: %d", 0xA, 0
 +
 +segment .bss
 +    num1 resd 1
 +    num2 resd 1
 +    result resd 1
 +    operation resb 1
 +
 +segment .text
 +
 +_main:
 +
 +    ; Eingabe erste Zahl
 +    push msg1
 +    call _printf
 +    add esp, 4
 +
 +    push num1
 +    push formatint
 +    call _scanf
 +    add esp, 8
 +
 +    ; Eingabe zweite Zahl
 +    push msg2
 +    call _printf
 +    add esp, 4
 +
 +    push num2
 +    push formatint
 +    call _scanf
 +    add esp, 8
 +
 +    ; Eingabe Rechenoperation
 +    push msg3
 +    call _printf
 +    add esp, 4
 +
 +    push operation
 +    push formatchar
 +    call _scanf
 +    add esp, 8
 +
 +    ; Rechnen
 +    mov eax, [num1]
 +    mov ebx, [num2]
 +
 +    movzx ecx, byte [operation]   ; Lade operation in ecx (mit zero extension)
 +
 +    cmp ecx, '+'
 +    je addieren
 +
 +    cmp ecx, '-'
 +    je subtrahieren
 +
 +    cmp ecx, '*'
 +    je multiplizieren
 +
 +    cmp ecx, '/'
 +    je dividieren
 +
 +    ; Unbekannte Operation -> abbrechen
 +    jmp ende
 +
 +addieren:
 +    add eax, ebx
 +    jmp speichern
 +
 +subtrahieren:
 +    sub eax, ebx
 +    jmp speichern
 +
 +multiplizieren:
 +    imul eax, ebx
 +    jmp speichern
 +
 +dividieren:
 +    cmp ebx, 0
 +    je ende        ; Division durch Null verhindern
 +    cdq            ; Vorzeichen erweitern für idiv
 +    idiv ebx
 +    jmp speichern
 +
 +speichern:
 +    mov [result], eax
 +
 +    ; Ausgabe
 +    push dword [result]
 +    push formatout
 +    call _printf
 +    add esp, 8
 +
 +ende:
 +    ret
 </code> </code>
  
coding/nasm.1745858555.txt.gz · Zuletzt geändert: 2025/04/28 18:42 von admin