.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