about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorKartik K. Agaram <vc@akkartik.com>2015-10-01 16:33:34 -0700
committerKartik K. Agaram <vc@akkartik.com>2015-10-01 16:33:34 -0700
commit16386f766ec1e347db8a19ebfd9cedaa9b281a5f (patch)
tree6e8c61ece47a340d4339e096d1abbbad237db605
parent96bb317f32d4e56af526076ebc472ec5ba5b3108 (diff)
downloadmu-16386f766ec1e347db8a19ebfd9cedaa9b281a5f.tar.gz
2231
-rw-r--r--021check_instruction.cc1
1 files changed, 1 insertions, 0 deletions
diff --git a/021check_instruction.cc b/021check_instruction.cc
index 1ef58dfa..2fd93f7b 100644
--- a/021check_instruction.cc
+++ b/021check_instruction.cc
@@ -16,6 +16,7 @@ void check_instruction(const recipe_ordinal r) {
   map<string, vector<type_ordinal> > metadata;
   for (long long int i = 0; i < SIZE(Recipe[r].steps); ++i) {
     instruction& inst = Recipe[r].steps.at(i);
+    if (inst.is_label) continue;
     switch (inst.operation) {
       // Primitive Recipe Checks
       case COPY: {
237d6324f1de1bb7150083eacf7b9af5f70'>ee9a9237 ^
6030d7e2 ^
9d27e966 ^

dd9ba09a ^
9d27e966 ^
dd9ba09a ^
ee9a9237 ^
6030d7e2 ^
ee9a9237 ^
6030d7e2 ^
9d27e966 ^
6030d7e2 ^


d9818a53 ^
03d50cc8 ^
6030d7e2 ^








ed0e64a9 ^
ee9a9237 ^
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52

                                         


                                                                            
                                   

                                                        











                                    


                                                                                                                                                 
 
              
                                                                                                                                                                       

                                        
                                                                                                                                                                      
                      
                                                                                                                                                                     
              
                                    
                      
                                                                                                                                                                  
                        


                                                                                                                                                                       
 
                                                             








                                                                                                                                                                             
 
                            
# Example showing arg order on the stack.
#
# Show difference between ascii codes of first letter of first arg and first
# letter of second arg.
#
# To run (from the subx directory):
#   $ ./subx translate examples/ex9.subx -o examples/ex9
#   $ ./subx run examples/ex9 z x
# Expected result:
#   $ echo $?
#   2
#
# At the start of a SubX program:
#   argc: *ESP
#   argv[0]: *(ESP+4)
#   argv[1]: *(ESP+8)
#   ...
# Locals start from ESP-4 downwards.

== code
#   instruction                     effective address                                                   register    displacement    immediate
# . op          subop               mod             rm32          base        index         scale       r32
# . 1-3 bytes   3 bits              2 bits          3 bits        3 bits      3 bits        2 bits      2 bits      0/1/2/4 bytes   0/1/2/4 bytes

    # . prolog
    89/copy                         3/mod/direct    5/rm32/EBP    .           .             .           4/r32/ESP   .               .                 # copy ESP to EBP
    # ascii-difference(argv[1], argv[2])
    # . . push argv[2]
    ff          6/subop/push        1/mod/*+disp8   5/rm32/EBP    .           .             .           .           0xc/disp8       .                 # push *(EBP+12)
    # . . push argv[1]
    ff          6/subop/push        1/mod/*+disp8   5/rm32/EBP    .           .             .           .           8/disp8         .                 # push *(EBP+8)
    # . . call
    e8/call  ascii-difference/disp32
    # . . discard args
    81          0/subop/add         3/mod/direct    4/rm32/ESP    .           .             .           .           .               8/imm32           # add to ESP
    # syscall(exit, EAX)
    89/copy                         3/mod/direct    3/rm32/EBX    .           .             .           0/r32/EAX   .               .                 # copy EAX to EBX
    b8/copy-to-EAX  1/imm32/exit
    cd/syscall  0x80/imm8

ascii-difference:  # (s1, s2) : null-terminated ascii strings
    # a = first letter of s1 (ECX)
    8b/copy                         1/mod/*+disp8   4/rm32/sib    4/base/ESP  4/index/none              0/r32/EAX   4/disp8         .                 # copy *(ESP+4) to EAX
    8b/copy                         0/mod/indirect  0/rm32/EAX    .           .             .           0/r32/EAX   .               .                 # copy *EAX to EAX
    # b = first letter of s2 (EDX)
    8b/copy                         1/mod/*+disp8   4/rm32/sib    4/base/ESP  4/index/none              1/r32/ECX   8/disp8                           # copy *(ESP+8) to ECX
    8b/copy                         0/mod/indirect  1/rm32/ECX    .           .             .           1/r32/ECX   .               .                 # copy *ECX to ECX
    # a-b
    29/subtract                     3/mod/direct    0/rm32/EAX    .           .             .           1/r32/ECX   .               .                 # subtract ECX from EAX
    c3/return

# . . vim:nowrap:textwidth=0