Commit b2f4944

mo khan <mo@mokhan.ca>
2025-01-18 20:39:36
Convert a c program into assembly using gcc
1 parent 2dd16b7
assignments/3/main.c
@@ -2,7 +2,20 @@
 
 int main(int argc, char *argv[])
 {
-  for (int i = 0; i < 10; i++) {
-    printf("%d\n", i);
+  int number = 0;
+  int max = -1;
+  int min = -1;
+
+  while(scanf("%d", &number) != EOF) {
+    if (max == -1 || number > max) {
+      max = number;
+    }
+    if (min == -1 || number < min) {
+      min = number;
+    }
+
+    number = 0;
   }
+
+  printf("Max: %d\nMin: %d\n", max, min);
 }
assignments/3/main.exe
Binary file
assignments/3/main.s
@@ -6,7 +6,9 @@
 	.text
 	.section	.rodata.str1.1,"aMS",@progbits,1
 .LC0:
-	.string	"%d\n"
+	.string	"%d"
+.LC1:
+	.string	"Max: %d\nMin: %d\n"
 	.section	.text.startup,"ax",@progbits
 	.p2align 4
 	.globl	main
@@ -14,28 +16,74 @@
 main:
 .LFB11:
 	.cfi_startproc
-	pushq	%rbx	#
+	pushq	%r12	#
 	.cfi_def_cfa_offset 16
-	.cfi_offset 3, -16
-# main.c:5:   for (int i = 0; i < 10; i++) {
-	xorl	%ebx, %ebx	# i
-	.p2align 4
+	.cfi_offset 12, -16
+	pushq	%rbp	#
+	.cfi_def_cfa_offset 24
+	.cfi_offset 6, -24
+# main.c:7:   int min = -1;
+	movl	$-1, %ebp	#, min
+# main.c:4: {
+	pushq	%rbx	#
+	.cfi_def_cfa_offset 32
+	.cfi_offset 3, -32
+# main.c:6:   int max = -1;
+	movl	$-1, %ebx	#, max
+# main.c:4: {
+	subq	$16, %rsp	#,
+	.cfi_def_cfa_offset 48
+	leaq	12(%rsp), %r12	#, tmp107
+# main.c:9:   while(scanf("%d", &number) != EOF) {
+	jmp	.L2	#
+	.p2align 4,,10
 	.p2align 3
+.L5:
+# main.c:10:     if (max == -1 || number > max) {
+	movl	12(%rsp), %eax	# number, pretmp_20
+# main.c:10:     if (max == -1 || number > max) {
+	cmpl	%eax, %ebx	# pretmp_20, max
+	movl	%eax, %edx	# pretmp_20, tmp108
+	cmovge	%ebx, %edx	# max,, tmp108
+	cmpl	$-1, %ebx	#, max
+	movl	%edx, %ebx	# tmp108, tmp108
+# main.c:13:     if (min == -1 || number < min) {
+	movl	%eax, %edx	# pretmp_20, tmp110
+# main.c:10:     if (max == -1 || number > max) {
+	cmove	%eax, %ebx	# tmp108,, pretmp_20, tmp108
+# main.c:13:     if (min == -1 || number < min) {
+	cmpl	%eax, %ebp	# pretmp_20, min
+	cmovle	%ebp, %edx	# min,, tmp110
+	cmpl	$-1, %ebp	#, min
+	cmovne	%edx, %eax	# tmp110,, pretmp_20
+	movl	%eax, %ebp	# pretmp_20, min
 .L2:
-# main.c:6:     printf("%d\n", i);
-	movl	%ebx, %esi	# i,
+# main.c:9:   while(scanf("%d", &number) != EOF) {
+	xorl	%eax, %eax	#
+	movq	%r12, %rsi	# tmp107,
 	movl	$.LC0, %edi	#,
+# main.c:5:   int number = 0;
+	movl	$0, 12(%rsp)	#, number
+# main.c:9:   while(scanf("%d", &number) != EOF) {
+	call	__isoc99_scanf	#
+# main.c:9:   while(scanf("%d", &number) != EOF) {
+	cmpl	$-1, %eax	#, tmp112
+	jne	.L5	#,
+# main.c:20:   printf("Max: %d\nMin: %d\n", max, min);
+	movl	%ebp, %edx	# min,
+	movl	%ebx, %esi	# max,
+	movl	$.LC1, %edi	#,
 	xorl	%eax, %eax	#
-# main.c:5:   for (int i = 0; i < 10; i++) {
-	addl	$1, %ebx	#, i
-# main.c:6:     printf("%d\n", i);
 	call	printf	#
-# main.c:5:   for (int i = 0; i < 10; i++) {
-	cmpl	$10, %ebx	#, i
-	jne	.L2	#,
-# main.c:8: }
+# main.c:21: }
+	addq	$16, %rsp	#,
+	.cfi_def_cfa_offset 32
 	xorl	%eax, %eax	#
 	popq	%rbx	#
+	.cfi_def_cfa_offset 24
+	popq	%rbp	#
+	.cfi_def_cfa_offset 16
+	popq	%r12	#
 	.cfi_def_cfa_offset 8
 	ret	
 	.cfi_endproc
assignments/3/Makefile
@@ -1,4 +1,13 @@
-default: main.s
+default: main.s main.exe numbers.txt
 
 main.s: main.c
 	gcc -S -fverbose-asm -O2 main.c
+
+main.exe: main.c
+	gcc -o main.exe main.c
+
+numbers.txt:
+	ruby -e '100.times { IO.write("numbers.txt", "#{rand(100_000_000)}\n", mode: "a+") }'
+
+run: main.exe numbers.txt
+	./main.exe < numbers.txt
assignments/3/numbers.txt
@@ -0,0 +1,100 @@
+92466815
+74269497
+87050963
+25751600
+8977277
+77496058
+30567041
+5491932
+73316075
+62877755
+45131658
+23209575
+52124207
+68541577
+96103422
+62574138
+46543308
+69316651
+80018420
+75836516
+58878100
+6148427
+44641940
+9142229
+61646141
+14736493
+17563644
+61133076
+48271908
+54418408
+84568705
+15645588
+57940938
+10026192
+8379555
+85693099
+8887701
+51277614
+86893573
+29301811
+9482011
+16525518
+55418577
+85246213
+99702148
+43592251
+89572153
+47687764
+16903422
+54985874
+21405561
+38938206
+40252034
+77770613
+84641140
+15944022
+20266861
+24590849
+73021859
+32635053
+65623867
+46364251
+89109658
+13712279
+86114503
+5544717
+63892
+66769336
+41908253
+92439154
+39785844
+39528483
+77990612
+4983638
+47246349
+32947081
+94376839
+1540652
+2165773
+60160647
+16783606
+35466343
+37097791
+75362813
+92732163
+62378631
+73101996
+53838971
+69587672
+20567356
+42877851
+57101803
+62146312
+64184386
+6339851
+57935937
+55319705
+19904225
+90504632
+87909544