Can you describe in more detail what you are trying to achieve?
I presume that you want to translate Pong with your own toolchain including your own OS?
Also could you clarify what you mean by your "lowest" label? If all of the labels in your program are resulting in addresses >32k, there is likely something substantially wrong in your translation.
In general remaining below the 32k limit can be challenging. As a first step it would be helpful to find out which part of the toolchain is contributing the most to the large size of the program. In most cases the efficiency of the VM translator is not sufficient.
This is how I would check the quality of my toolchain:
1. OS
-> Compile your own OS with the official JackCompiler
-> Compare the number of lines (or more precisely the number of VM instructions excluding labels) with the number of lines in the VM files of the official OS (from the tools/OS folder)
-> If your OS results in significantly more VM code, your jack code in project 12 can be improved
2. Compiler
-> Compile the 4 Pong *.jack files from project 11 with your own compiler
-> Compiler the 4 Pong *.jack files with the official compiler
-> Compare the number of lines in the resulting VM files
-> If your compiler generates more VM code, your compiler code generation from project 10/11 can be improved
3. VM Translator (most likely root cause)
-> As a KPI to measure the quality of the generated ASM code, you can calculate the number of lines in the generated ASM file divided by the number of lines of code in the VM files.
-> (exclude labels in both VM and ASM files in the KPI calculation, since labels are just used for addressing and don't generate any hack code)
-> A good translator should be around max 5-6 ASM lines per VM
-> There are plenty of posts regarding the reduction of generated code in this forum under "project 8"
-> Low hanging fruits are:
-->Dead code elimination (removal of code that is not in use, i.e. Math.sqrt is like many other OS routines not used by Pong, so the translator can detect that and safely remove all respective functions)
-->Global functions for certain VM commands (the easiest one probably being RETURN; instead of generating the code for return for every occurrence, you can just generate a generic return handler and jump to the routine for every subsequent occurrence of RETURN)
4. More complex programs than Pong
If the above measures are not sufficient because the program that you want to translate is too long/complex, you may want to look into a code generation technique that I briefly explained
here