/* sum_list - Sum the elements of a linked list */ long sum_list(list_ptr ls) { long val = 0; while (ls) { val += ls->val; ls = ls->next; } return val; }
# Execution begins at address 0 .pos 0 irmovq stack, %rsp # Set up stack pointer call main # Execute main program halt # Terminate program # 内存区域,存放数据/链表之类 # Sample linked list .align 8 ele1: .quad 0x00a .quad ele2 ele2: .quad 0x0b0 .quad ele3 ele3: .quad 0xc00 .quad 0 # END
main: irmovq ele1,%rdi #参数准备 call sum_list # sum_list(ele1) ret
# long sum_list(long i) # ele1 in %rdi sum_list: xorq %rax,%rax #val=0 loop: mrmovq (%rdi),%r8 #读取node.val值到寄存器r8 addq %r8,%rax #将结果加到return val中 mrmovq 8(%rdi),%rdi jmp test #无条件跳转到test test: andq %rdi,%rdi jne loop ret
# Stack starts here and grows to lower addresses. # 这里自定义栈开始地址 .pos 0x200 stack:
执行以下命令可以得到测试结果
1
./yas sum_list.ys ./yis sum_list.yo
rsum_list
1 2 3 4 5 6 7 8 9 10 11 12
/* rsum_list - Recursive version of sum_list */ long rsum_list(list_ptr ls) { if (!ls) return 0; else { long val = ls->val; long rest = rsum_list(ls->next); return val + rest; } }
/* copy_block - Copy src to dest and return xor checksum of src */ long copy_block(long *src, long *dest, long len) { long result = 0; while (len > 0) { long val = *src++; //两个语句:long val = *src;src++; *dest++ = val;//两个语句:*dest = val;dest++ result ^= val;//update checksum len--; } return result; }