2013-12-19 22:22:57 +01:00

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