90 lines
1.9 KiB
NASM
90 lines
1.9 KiB
NASM
.data
|
|
# zu überprüfende Matrikelnummer einkommentieren:
|
|
|
|
# matr: .long 0,9,3,9,1,8,2 # --> falsch
|
|
# matr: .long 1,2,3,4,5,6,7 # --> falsch
|
|
matr: .long 0,6,1,1,8,1,3 # --> richtig
|
|
# matr: .long 1,3,9,8,1,4,0 # --> falsch
|
|
# matr: .long 1,5,6,9,2,0,3 # --> falsch
|
|
|
|
intout:
|
|
.string "1 -> Matrikelnummer richtig\n2 -> Matrikelnummer falsch\nWert: %d\n"
|
|
|
|
.text
|
|
|
|
.globl main
|
|
|
|
main:
|
|
|
|
xor %ecx, %ecx # %ecx = 0
|
|
xor %edi, %edi # 0 in Indexregister ("xor" ist schneller als "movl $0, reg")
|
|
|
|
|
|
movl matr(,%edi,4), %ebx # liest erste Stelle (a)
|
|
imull $9, %ebx # a * 9
|
|
addl %ebx, %ecx # %ecx += a
|
|
|
|
inc %edi # %edi += 1
|
|
movl matr(,%edi,4), %ebx # liest zweite Stelle (b)
|
|
imull $7, %ebx # b * 7
|
|
addl %ebx, %ecx # %ecx += b
|
|
|
|
inc %edi # %edi += 1
|
|
movl matr(,%edi,4), %ebx # liest dritte Stelle (c)
|
|
imull $3, %ebx # c * 3
|
|
addl %ebx, %ecx # %ecx += c
|
|
|
|
inc %edi # %edi += 1
|
|
movl matr(,%edi,4), %ebx # liest vierte Stelle (d)
|
|
imull $9, %ebx # d * 9
|
|
addl %ebx, %ecx # %ecx += c
|
|
|
|
inc %edi # %edi += 1
|
|
movl matr(,%edi,4), %ebx # liest fünfte Stelle (e)
|
|
imull $7, %ebx # e * 7
|
|
addl %ebx, %ecx # %ecx += c
|
|
|
|
inc %edi # %edi += 1
|
|
movl matr(,%edi,4), %ebx # liest sechste Stelle (f)
|
|
imull $3, %ebx # f * 3
|
|
addl %ebx, %ecx # %ecx += c
|
|
|
|
|
|
|
|
|
|
movl %ecx, %eax # bereite für Division vor
|
|
|
|
movl $10, %ebx
|
|
xor %edx, %edx # %edx leeren, sonst loating point exception, da noch alter Wert in %edx steht
|
|
|
|
idivl %ebx # %eax / %ebx (10) Quotient liegt nun in %eax, Rest in %edx
|
|
|
|
inc %edi # %edi += 1
|
|
movl matr(,%edi,4), %eax # %eax = siebte Stelle (g)
|
|
|
|
|
|
|
|
cmp %edx, %eax # Vergleiche Rest mit g
|
|
je .true # rest = g
|
|
|
|
jmp .false # rest != g
|
|
|
|
.true:
|
|
movl $1, %eax # Ausgabe true -> 1
|
|
jmp .ende # "false-Label" überspringen
|
|
|
|
.false:
|
|
movl $0, %eax # Ausgabe false -> 0
|
|
|
|
.ende:
|
|
|
|
|
|
# Wert im %eax ausgeben
|
|
pushl %eax
|
|
pushl $intout
|
|
call printf
|
|
|
|
|
|
# Exit
|
|
movl $1, %eax
|
|
int $0x80 |