Permalink
Browse files

RU-A5 is now looks better, listings, etc

  • Loading branch information...
1 parent 07af774 commit 9bcd72d176b1f86aa31dda21007740f83ae90484 @dennis714 committed Oct 1, 2016
Showing with 644 additions and 629 deletions.
  1. +1 −1 .travis.yml
  2. +4 −4 advanced/120_division_by_9/2_EN.asm
  3. +5 −5 advanced/120_division_by_9/2_RU.asm
  4. +1 −1 advanced/120_division_by_9/form_RU.asm
  5. +1 −0 call_for_translators_AF.tex
  6. +1 −1 patterns/01_helloworld/ARM/ARM64_EN.tex
  7. +1 −1 patterns/01_helloworld/ARM/ARM64_ITA.tex
  8. +1 −1 patterns/01_helloworld/ARM/ARM64_RU.tex
  9. +6 −3 patterns/01_helloworld/GCC_x86_RU.tex
  10. +1 −1 patterns/01_helloworld/MIPS/hw_O0_IDA_RU.lst
  11. +1 −1 patterns/01_helloworld/MIPS/hw_O0_RU.s
  12. +2 −2 patterns/01_helloworld/MIPS/hw_O3_IDA_RU.lst
  13. +1 −1 patterns/01_helloworld/MIPS/hw_O3_RU.s
  14. +3 −2 patterns/01_helloworld/MSVC_x86_RU.tex
  15. +5 −5 patterns/02_stack/01_saving_ret_addr_EN.tex
  16. +5 −5 patterns/02_stack/01_saving_ret_addr_ITA.tex
  17. +5 −5 patterns/02_stack/01_saving_ret_addr_PTBR.tex
  18. +5 −5 patterns/02_stack/01_saving_ret_addr_RU.tex
  19. +6 −4 patterns/02_stack/02_args_passing_RU.tex
  20. +4 −4 patterns/02_stack/04_alloca/2_1_gcc_intel_O3_EN.asm
  21. +4 −4 patterns/02_stack/04_alloca/2_1_gcc_intel_O3_RU.asm
  22. +3 −3 patterns/02_stack/04_alloca/2_2_msvc.asm
  23. +1 −1 patterns/02_stack/main_RU.tex
  24. +2 −2 patterns/03_printf/ARM/ARM8_O0_RU.lst
  25. +2 −2 patterns/03_printf/ARM/ARM8_RU.tex
  26. +9 −9 patterns/03_printf/MIPS/printf8.O0.IDA_RU.lst
  27. +9 −9 patterns/03_printf/MIPS/printf8.O0_RU.s
  28. +10 −10 patterns/03_printf/MIPS/printf8.O3.IDA_RU.lst
  29. +9 −9 patterns/03_printf/MIPS/printf8.O3_RU.s
  30. +20 −20 patterns/03_printf/mainRU.tex
  31. +7 −7 patterns/03_printf/x86/add_example_EN.lst
  32. +7 −7 patterns/03_printf/x86/add_example_RU.lst
  33. +22 −22 patterns/03_printf/x86/x86_RU.tex
  34. +4 −4 patterns/04_scanf/1_simple/ARM64_GCC491_O0_RU.s
  35. +28 −28 patterns/04_scanf/1_simple/MIPS/ex1.O3.IDA_EN.lst
  36. +28 −28 patterns/04_scanf/1_simple/MIPS/ex1.O3.IDA_RU.lst
  37. +2 −0 patterns/04_scanf/1_simple/x86_RU.tex
  38. +1 −1 patterns/04_scanf/2_global/MIPS/O3_objdump_RU.txt
  39. +2 −1 patterns/04_scanf/2_global/ex2_global_vars_ARM_RU.tex
  40. +1 −1 patterns/04_scanf/3_checking_retval/ARM64_GCC491_O0_RU.s
  41. +39 −39 patterns/04_scanf/3_checking_retval/MIPS_O3_IDA.lst
  42. BIN patterns/04_scanf/3_checking_retval/hiew_1.png
  43. BIN patterns/04_scanf/3_checking_retval/hiew_1_original.png
  44. BIN patterns/04_scanf/3_checking_retval/hiew_2.png
  45. BIN patterns/04_scanf/3_checking_retval/hiew_2_original.png
  46. +14 −14 patterns/05_passing_arguments/ARM/no_keil_ARM_EN.tex
  47. +14 −14 patterns/05_passing_arguments/ARM/no_keil_ARM_ITA.tex
  48. +14 −14 patterns/05_passing_arguments/ARM/no_keil_ARM_RU.tex
  49. +2 −2 patterns/05_passing_arguments/ARM/o_keil_ARM_EN.tex
  50. +2 −2 patterns/05_passing_arguments/ARM/o_keil_ARM_ITA.tex
  51. +2 −2 patterns/05_passing_arguments/ARM/o_keil_ARM_RU.tex
  52. +3 −3 patterns/05_passing_arguments/ARM/thumb_EN.tex
  53. +3 −3 patterns/05_passing_arguments/ARM/thumb_ITA.tex
  54. +3 −3 patterns/05_passing_arguments/ARM/thumb_RU.tex
  55. +25 −25 patterns/05_passing_arguments/MIPS_O3_IDA_EN.lst
  56. +26 −26 patterns/05_passing_arguments/MIPS_O3_IDA_RU.lst
  57. +19 −19 patterns/05_passing_arguments/ex64_GCC_O3_IDA_EN.asm
  58. +19 −19 patterns/05_passing_arguments/ex64_GCC_O3_IDA_RU.asm
  59. +34 −34 patterns/05_passing_arguments/gcc_EN.asm
  60. +34 −34 patterns/05_passing_arguments/gcc_RU.asm
  61. +7 −7 patterns/061_pointers/global.asm
  62. +5 −5 patterns/061_pointers/local.asm
  63. +1 −1 patterns/061_pointers/local_RU.c
  64. +1 −1 patterns/06_return_results/main_RU.tex
  65. +1 −1 patterns/07_jcc/abs/abs_GCC49_ARM64_O0_RU.s
  66. +1 −1 patterns/07_jcc/abs/abs_MSVC2012_Ox_x64_RU.asm
  67. +1 −1 patterns/07_jcc/cond_operator/ARM64_GCC_O3_RU.s
  68. +2 −2 patterns/07_jcc/cond_operator/Keil_ARM_O3_RU.s
  69. +1 −1 patterns/07_jcc/cond_operator/Keil_thumb_O3_RU.s
  70. +1 −1 patterns/07_jcc/cond_operator/cond2_GCC_O3_RU.s
  71. +3 −3 patterns/07_jcc/main_RU.tex
  72. +2 −2 patterns/07_jcc/minmax/minmax64_GCC_49_ARM64_O3_RU.s
  73. +2 −2 patterns/07_jcc/minmax/minmax64_GCC_49_x64_O3_RU.s
  74. +2 −2 patterns/07_jcc/minmax/minmax_GCC481_O3_RU.s
  75. +4 −4 patterns/07_jcc/minmax/minmax_Keil_ARM_O3_RU.s
  76. +4 −4 patterns/07_jcc/simple/ARM/ARM64_GCC_O3_unsigned_RU.lst
  77. +1 −1 patterns/07_jcc/simple/O0_MIPS_signed_IDA_RU.lst
  78. +1 −1 patterns/08_switch/2_lot/main_RU.tex
  79. +5 −5 patterns/08_switch/2_lot/skel1_RU.lst
  80. +2 −2 patterns/08_switch/3_several_cases/ARM64_GCC491_O3_RU.s
  81. +1 −1 patterns/09_loops/memcpy/memcpy_Keil_ARM_O3_RU.s
  82. +1 −1 patterns/09_loops/memcpy/memcpy_Keil_Thumb_O3_RU.s
  83. +1 −1 patterns/09_loops/simple/1_MSVC_EN.asm
  84. +1 −1 patterns/09_loops/simple/1_MSVC_RU.asm
  85. +2 −1 patterns/09_loops/simple/2_GCC_RU.asm
  86. +1 −1 patterns/09_loops/simple/ARM/main_RU.tex
  87. +1 −1 patterns/09_loops/simple/MIPS_O0_IDA_RU.lst
  88. +2 −2 patterns/09_loops/simple/loops_1_RU.c
  89. +1 −1 patterns/09_loops/simple/loops_3_RU.c
  90. +1 −1 patterns/09_loops/simple/x86_RU.tex
  91. +1 −1 patterns/09_loops/skeleton_ARM_RU.lst
  92. +1 −1 patterns/09_loops/skeleton_x86_2_9_RU.lst
  93. +1 −1 patterns/09_loops/skeleton_x86_2_9_optimized_RU.lst
  94. +1 −1 patterns/09_loops/skeleton_x86_2_9_order_RU.lst
  95. +1 −1 patterns/09_loops/skeleton_x86_2_9_reg_RU.lst
  96. +1 −1 patterns/09_loops/skeleton_x86_2_9_reorder_RU.lst
  97. +1 −1 patterns/09_loops/skeleton_x86_loop_RU.lst
  98. +1 −1 patterns/10_strings/1_strlen/10_1_msvc_RU.asm
  99. +1 −1 patterns/10_strings/1_strlen/ARM/ARM64_GCC_O0_RU.lst
  100. +1 −1 patterns/10_strings/1_strlen/ARM/ARM64_GCC_O3_EN.lst
  101. +3 −3 patterns/10_strings/1_strlen/ARM/ARM64_GCC_O3_RU.lst
  102. +2 −3 patterns/12_FPU/1_simple/ARM/main_EN.tex
  103. +2 −2 patterns/12_FPU/1_simple/ARM/main_RU.tex
  104. +5 −5 patterns/12_FPU/1_simple/MIPS_O3_IDA_RU.lst
  105. +2 −1 patterns/12_FPU/1_simple/MSVC_EN.asm
  106. +2 −1 patterns/12_FPU/1_simple/MSVC_RU.asm
  107. +2 −2 patterns/12_FPU/1_simple/MSVC_RU.tex
  108. +13 −13 patterns/12_FPU/2_passing_floats/Keil_ARM_O0.asm
  109. +4 −4 patterns/12_FPU/2_passing_floats/MIPS_O3_IDA_RU.lst
  110. +1 −1 patterns/12_FPU/2_passing_floats/MSVC_EN.asm
  111. +1 −1 patterns/12_FPU/2_passing_floats/MSVC_RU.asm
  112. +21 −21 patterns/12_FPU/2_passing_floats/Xcode_thumb_O0.asm
  113. +2 −1 patterns/12_FPU/3_comparison/ARM/ARM32_RU.tex
  114. +2 −2 patterns/12_FPU/3_comparison/MIPS_O3_IDA_RU.lst
  115. +1 −1 patterns/12_FPU/3_comparison/MIPS_RU.tex
  116. +1 −1 patterns/12_FPU/3_comparison/x86/GCC481_O3_RU.s
  117. +2 −1 patterns/12_FPU/3_comparison/x86/GCC_O3_EN.asm
  118. +2 −1 patterns/12_FPU/3_comparison/x86/GCC_O3_RU.asm
  119. +1 −1 patterns/12_FPU/3_comparison/x86/GCC_RU.asm
  120. +1 −1 patterns/12_FPU/3_comparison/x86/MSVC/main_EN.tex
  121. +1 −1 patterns/12_FPU/3_comparison/x86/MSVC/main_RU.tex
  122. +4 −4 patterns/13_arrays/1_simple/ARM64_GCC491_O0_RU.s
  123. +2 −2 patterns/13_arrays/1_simple/MIPS_O3_IDA_RU.lst
  124. +4 −4 patterns/13_arrays/1_simple/simple_Keil_ARM_O0_RU.asm
  125. +4 −4 patterns/13_arrays/1_simple/simple_Keil_thumb_O3_RU.asm
  126. +1 −1 patterns/13_arrays/55_month_2D/MSVC2013_x64_Ox_RU.asm
  127. +1 −1 patterns/13_arrays/55_month_2D/MSVC2013_x64_RU.asm
  128. +2 −2 patterns/13_arrays/5_multidimensional/2D_as_1D_GCC49_x64_O3_RU.s
  129. +1 −1 patterns/15_structs/6_bitfields/cpuid/olly_RU.tex
  130. +2 −2 thanks.tex
View
@@ -26,5 +26,5 @@ addons:
- texlive-fonts-extra
script:
- - make EN # was: all
+ - make all > /dev/null # Travis won't handle that long log files
@@ -1,9 +1,9 @@
_f3_32_unsigned PROC
mov eax, -1431655765 ; aaaaaaabH
mul DWORD PTR _a$[esp-4] ; unsigned multiply
-; EDX=(input*0xaaaaaaab)/2^32
+; EDX=§$\frac{input \cdot 0xaaaaaaab}{2^{32}}$§
shr edx, 1
-; EDX=(input*0xaaaaaaab)/2^33
+; EDX=§$\frac{input \cdot 0xaaaaaaab}{2^{33}}$§
mov eax, edx
ret 0
_f3_32_unsigned ENDP
@@ -12,8 +12,8 @@ _f3_32_signed PROC
mov eax, 1431655766 ; 55555556H
imul DWORD PTR _a$[esp-4] ; signed multiply
; take high part of product
-; it is just the same as if to shift product by 32 bits right or to divide it by 2^32
- mov eax, edx ; EAX=EDX=(input*0x55555556)/2^32
+; it is just the same as if to shift product by 32 bits right or to divide it by §$2^{32}$§
+ mov eax, edx ; EAX=EDX=§$\frac{input \cdot 0x55555556}{2^{32}}$§
shr eax, 31 ; 0000001fH
add eax, edx ; add 1 if sign is negative
ret 0
@@ -1,9 +1,9 @@
_f3_32_unsigned PROC
mov eax, -1431655765 ; aaaaaaabH
mul DWORD PTR _a$[esp-4] ; беззнаковое умножение
-; EDX=(input*0xaaaaaaab)/2^32
- shr edx, 1
-; EDX=(input*0xaaaaaaab)/2^33
+; EDX=§$\frac{input \cdot 0xaaaaaaab}{2^{32}}$§
+ shr edx, 1
+; EDX=§$\frac{input \cdot 0xaaaaaaab}{2^{33}}$§
mov eax, edx
ret 0
_f3_32_unsigned ENDP
@@ -12,8 +12,8 @@ _f3_32_signed PROC
mov eax, 1431655766 ; 55555556H
imul DWORD PTR _a$[esp-4] ; знаковое умножение
; берем старшую часть произведения
-; это всё равно что сдвинуть произведение на 32 бита вправо, либо разделить его на 2^32
- mov eax, edx ; EAX=EDX=(input*0x55555556)/2^32
+; это всё равно что сдвинуть произведение на 32 бита вправо, либо разделить его на §$2^{32}$§
+ mov eax, edx ; EAX=EDX=§$\frac{input \cdot 0x55555556}{2^{32}}$§
shr eax, 31 ; 0000001fH
add eax, edx ; прибавить 1 если знак отрицательный
ret 0
@@ -1,6 +1,6 @@
mov eax, MAGICAL CONSTANT
imul входное значение
- sar edx, SHIFTING COEFFICIENT ; знаковое деление на 2^x$§ при помощи арифметического сдвига вправо
+ sar edx, SHIFTING COEFFICIENT ; знаковое деление на §$2^x$§ при помощи арифметического сдвига вправо
mov eax, edx
shr eax, 31
add eax, edx
@@ -1,3 +1,4 @@
+% Afrikaans
\vspace*{\fill}
% to translate:
@@ -81,7 +81,7 @@
The result is the same, but that's how \MOV at that line looks like now:
\begin{lstlisting}[caption=\NonOptimizing GCC 4.8.1 + objdump]
- 4005a4: d2800000 mov x0, #0x0 // #0
+ 4005a4: d2800000 mov x0, #0x0 // #0
\end{lstlisting}
\myindex{ARM!\Instructions!LDP}
@@ -81,7 +81,7 @@ \subsubsection{ARM64}
Il risultato e' lo stesso, ma quell'istruzione MOV adesso appare cosi':
\begin{lstlisting}[caption=\NonOptimizing GCC 4.8.1 + objdump]
- 4005a4: d2800000 mov x0, #0x0 // #0
+ 4005a4: d2800000 mov x0, #0x0 // #0
\end{lstlisting}
\myindex{ARM!\Instructions!LDP}
@@ -85,7 +85,7 @@ \subsubsection{ARM64}
Результат точно такой же, только \MOV в той строке теперь выглядит так:
\begin{lstlisting}[caption=\NonOptimizing GCC 4.8.1 + objdump]
- 4005a4: d2800000 mov x0, #0x0 // #0
+ 4005a4: d2800000 mov x0, #0x0 // #0
\end{lstlisting}
\myindex{ARM!\Instructions!LDP}
@@ -47,7 +47,8 @@ \subsubsection{GCC}
\myindex{x86!\Instructions!LEAVE}
Последняя инструкция \LEAVE~--- это аналог команд \TT{MOV ESP, EBP} и \TT{POP EBP}~--- то есть возврат \glslink{stack pointer}{указателя стека} и регистра \EBP в первоначальное состояние.
-Это необходимо, т.к. в начале функции мы модифицировали регистры \ESP и \EBP (при помощи \INS{MOV EBP, ESP} / \INS{AND ESP, \ldots}).
+Это необходимо, т.к. в начале функции мы модифицировали регистры \ESP и \EBP{}\\
+(при помощи \INS{MOV EBP, ESP} / \INS{AND ESP, \ldots}).
\subsubsection{GCC: \ATTSyntax}
\label{ATT_syntax}
@@ -81,9 +82,11 @@ \subsubsection{GCC: \ATTSyntax}
\item
Операнды записываются наоборот.
-В Intel-синтаксисе: <инструкция> <операнд назначения> <операнд-источник>.
+В Intel-синтаксисе: \\
+<инструкция> <операнд назначения> <операнд-источник>.
-В AT\&T-синтаксисе: <инструкция> <операнд-источник> <операнд назначения>.
+В AT\&T-синтаксисе: \\
+<инструкция> <операнд-источник> <операнд назначения>.
\myindex{\CStandardLibrary!memcpy()}
\myindex{\CStandardLibrary!strcpy()}
@@ -9,7 +9,7 @@
.text:00000000 addiu $sp, -0x20
.text:00000004 sw $ra, 0x20+var_4($sp)
.text:00000008 sw $fp, 0x20+var_8($sp)
-; установить FP (указатель стекового фрейма):
+; §установить FP (указатель стекового фрейма)§:
.text:0000000C move $fp, $sp
; установить GP:
.text:00000010 la $gp, __gnu_local_gp
@@ -6,7 +6,7 @@ main:
addiu $sp,$sp,-32
sw $31,28($sp)
sw $fp,24($sp)
-; установить FP (указатель стекового фрейма):
+; §установить FP (указатель стекового фрейма)§:
move $fp,$sp
; установить GP:
lui $28,%hi(__gnu_local_gp)
@@ -11,13 +11,13 @@
; сохранить RA в локальном стеке:
.text:0000000C sw $ra, 0x20+var_4($sp)
; сохранить GP в локальном стеке:
-; по какой-то причине, этой инструкции не было в ассемблерном выводе в GCC:
+; §по какой-то причине§, этой инструкции не было в ассемблерном выводе в GCC:
.text:00000010 sw $gp, 0x20+var_10($sp)
; загрузить адрес функции puts() из GP в $t9:
.text:00000014 lw $t9, (puts & 0xFFFF)($gp)
; сформировать адрес текстовой строки в $a0:
.text:00000018 lui $a0, ($LC0 >> 16) # "Hello, world!"
-; перейти на puts(), сохранив адрес возврата в link-регистре:
+; §перейти на puts(), сохранив адрес возврата в link-регистре:§
.text:0000001C jalr $t9
.text:00000020 la $a0, ($LC0 & 0xFFFF) # "Hello, world!"
; восстановить RA:
@@ -13,7 +13,7 @@ main:
lw $25,%call16(puts)($28)
; загрузить адрес текстовой строки в $4 ($a0):
lui $4,%hi($LC0)
-; перейти на puts(), сохранив адрес возврата в link-регистре:
+; §перейти на puts(), сохранив адрес возврата в link-регистре:§
jalr $25
addiu $4,$4,%lo($LC0) ; branch delay slot
; восстановить RA:
@@ -62,7 +62,7 @@ \subsubsection{MSVC}
\myindex{x86!\Instructions!ADD}
\INS{ADD ESP, 4} означает прибавить 4 к значению в регистре \ESP.
-Почему 4? Так как это 32-битный код, для передачи адреса нужно 4 байта. В x64-коде это 8 байт.
+Почему 4? Так как это 32-битный код, для передачи адреса нужно 4 байта. В x64-коде это 8 байт.\\
\INS{ADD ESP, 4} эквивалентно \TT{POP регистр}, но без использования какого-либо регистра\footnote{Флаги процессора, впрочем, модифицируются}.
\myindex{Intel C++}
@@ -88,7 +88,8 @@ \subsubsection{MSVC}
После вызова \printf в оригинальном коде на \CCpp указано \TT{return 0}~--- вернуть 0 в качестве результата функции \main.
\myindex{x86!\Instructions!XOR}
-В сгенерированном коде это обеспечивается инструкцией \INS{XOR EAX, EAX}.
+В сгенерированном коде это обеспечивается инструкцией \\
+\INS{XOR EAX, EAX}.
\myindex{x86!\Instructions!MOV}
@@ -40,30 +40,30 @@ \subsubsection{Save the function's return address}
\dots but generates the right code anyway:
\begin{lstlisting}
-?f@@YAXXZ PROC ; f
+?f@@YAXXZ PROC ; f
; File c:\tmp6\ss.cpp
; Line 2
push ebp
mov ebp, esp
; Line 3
- call ?f@@YAXXZ ; f
+ call ?f@@YAXXZ ; f
; Line 4
pop ebp
ret 0
-?f@@YAXXZ ENDP ; f
+?f@@YAXXZ ENDP ; f
\end{lstlisting}
\dots Also if we turn on the compiler optimization (\TT{\Ox} option) the optimized code will not overflow the stack
and will work \IT{correctly}\footnote{irony here} instead:
\begin{lstlisting}
-?f@@YAXXZ PROC ; f
+?f@@YAXXZ PROC ; f
; File c:\tmp6\ss.cpp
; Line 2
$LL3@f:
; Line 3
jmp SHORT $LL3@f
-?f@@YAXXZ ENDP ; f
+?f@@YAXXZ ENDP ; f
\end{lstlisting}
GCC 4.4.1 generates similar code in both cases without, however, issuing any warning about the problem.
@@ -40,30 +40,30 @@ \subsubsection{Salvare l'indirizzo di ritorno della funzione}
\dots ma genera in ogni caso il codice correttamente:
\begin{lstlisting}
-?f@@YAXXZ PROC ; f
+?f@@YAXXZ PROC ; f
; File c:\tmp6\ss.cpp
; Line 2
push ebp
mov ebp, esp
; Line 3
- call ?f@@YAXXZ ; f
+ call ?f@@YAXXZ ; f
; Line 4
pop ebp
ret 0
-?f@@YAXXZ ENDP ; f
+?f@@YAXXZ ENDP ; f
\end{lstlisting}
\dots Se attiviamo le ottimizzazioni del compilatore (\TT{\Ox} option) il codice ottimizzato non causera' overflow dello stack
e funzionera' invece \IT{correttamente}\footnote{sarcasmo, si fa per dire}:
\begin{lstlisting}
-?f@@YAXXZ PROC ; f
+?f@@YAXXZ PROC ; f
; File c:\tmp6\ss.cpp
; Line 2
$LL3@f:
; Line 3
jmp SHORT $LL3@f
-?f@@YAXXZ ENDP ; f
+?f@@YAXXZ ENDP ; f
\end{lstlisting}
GCC 4.4.1 genera codice simile in antrambi i casi, senza avvertire del problema.
@@ -39,30 +39,30 @@ \subsubsection{Salvar o endereço de retorno de uma função}
\dots mas gera o código de qualquer maneira:
\begin{lstlisting}
-?f@@YAXXZ PROC ; f
+?f@@YAXXZ PROC ; f
; File c:\tmp6\ss.cpp
; Line 2
push ebp
mov ebp, esp
; Line 3
- call ?f@@YAXXZ ; f
+ call ?f@@YAXXZ ; f
; Line 4
pop ebp
ret 0
-?f@@YAXXZ ENDP ; f
+?f@@YAXXZ ENDP ; f
\end{lstlisting}
\dots também, se ativarmos a otimização do compilador (opção \TT{/Ox})
o código otimizado não vai estourar a pilha e funcionará \IT{corretamente} \footnote{ironia aqui}:
\begin{lstlisting}
-?f@@YAXXZ PROC ; f
+?f@@YAXXZ PROC ; f
; File c:\tmp6\ss.cpp
; Line 2
$LL3@f:
; Line 3
jmp SHORT $LL3@f
-?f@@YAXXZ ENDP ; f
+?f@@YAXXZ ENDP ; f
\end{lstlisting}
\PTBRph{}
@@ -40,30 +40,30 @@ \subsubsection{Сохранение адреса возврата управле
\dots но, тем не менее, создает нужный код:
\begin{lstlisting}
-?f@@YAXXZ PROC ; f
+?f@@YAXXZ PROC ; f
; File c:\tmp6\ss.cpp
; Line 2
push ebp
mov ebp, esp
; Line 3
- call ?f@@YAXXZ ; f
+ call ?f@@YAXXZ ; f
; Line 4
pop ebp
ret 0
-?f@@YAXXZ ENDP ; f
+?f@@YAXXZ ENDP ; f
\end{lstlisting}
\dots причем, если включить оптимизацию (\TT{\Ox}), то будет даже интереснее, без переполнения стека,
но работать будет \IT{корректно}\footnote{здесь ирония}:
\begin{lstlisting}
-?f@@YAXXZ PROC ; f
+?f@@YAXXZ PROC ; f
; File c:\tmp6\ss.cpp
; Line 2
$LL3@f:
; Line 3
jmp SHORT $LL3@f
-?f@@YAXXZ ENDP ; f
+?f@@YAXXZ ENDP ; f
\end{lstlisting}
GCC 4.4.1 генерирует точно такой же код в обоих случаях, хотя и не предупреждает о проблеме.
@@ -44,7 +44,9 @@ \subsubsection{Передача параметров функции}
\printf выведет 1234, затем ещё два случайных числа, которые волею случая оказались в стеке рядом.
\par
-Вот почему не так уж и важно, как объявлять функцию \main{}: как \main{}, \TT{main(int argc, char *argv[])} либо \TT{main(int argc, char *argv[], char *envp[])}.
+Вот почему не так уж и важно, как объявлять функцию \main{}:\\
+как \main{}, \TT{main(int argc, char *argv[])}\\
+либо \TT{main(int argc, char *argv[], char *envp[])}.
В реальности, \ac{CRT}-код вызывает \main примерно так:
@@ -92,10 +94,10 @@ \subsubsection{Передача параметров функции}
\begin{lstlisting}
mov dx, msg ; адрес сообщения
-mov ah, 9 ; 9 означает ф-цию "вывод строки"
+mov ah, 9 ; §9 означает ф-цию "вывод строки"§
int 21h ; DOS "syscall"
-mov ah, 4ch ; ф-ция "закончить программу"
+mov ah, 4ch ; §ф-ция "закончить программу"§
int 21h ; DOS "syscall"
msg db 'Hello, World!\$'
@@ -127,7 +129,7 @@ \subsubsection{Передача параметров функции}
Иначе, хэндл только что созданного файла возвращается в \TT{AX}.
Этот метод до сих пор используется программистами на ассемблере.
-В исходных кодах Windows Research Kernel (который очень похож на Windows 2003) мы можем найти такое
+В исходных кодах Windows Research Kernel (который очень похож на Windows 2003) мы можем найти такое\\
(файл \IT{base/ntos/ke/i386/cpu.asm}):
\begin{lstlisting}
@@ -6,15 +6,15 @@ f:
push ebx
sub esp, 660
lea ebx, [esp+39]
- and ebx, -16 ; align pointer by 16-bit border
- mov DWORD PTR [esp], ebx ; s
+ and ebx, -16 ; align pointer by 16-bit border
+ mov DWORD PTR [esp], ebx ; s
mov DWORD PTR [esp+20], 3
mov DWORD PTR [esp+16], 2
mov DWORD PTR [esp+12], 1
mov DWORD PTR [esp+8], OFFSET FLAT:.LC0 ; "hi! %d, %d, %d\n"
- mov DWORD PTR [esp+4], 600 ; maxlen
+ mov DWORD PTR [esp+4], 600 ; maxlen
call _snprintf
- mov DWORD PTR [esp], ebx ; s
+ mov DWORD PTR [esp], ebx ; s
call puts
mov ebx, DWORD PTR [ebp-4]
leave
@@ -6,15 +6,15 @@ f:
push ebx
sub esp, 660
lea ebx, [esp+39]
- and ebx, -16 ; выровнять указатель по 16-байтной границе
- mov DWORD PTR [esp], ebx ; s
+ and ebx, -16 ; §выровнять указатель по 16-байтной границе§
+ mov DWORD PTR [esp], ebx ; s
mov DWORD PTR [esp+20], 3
mov DWORD PTR [esp+16], 2
mov DWORD PTR [esp+12], 1
mov DWORD PTR [esp+8], OFFSET FLAT:.LC0 ; "hi! %d, %d, %d\n"
- mov DWORD PTR [esp+4], 600 ; maxlen
+ mov DWORD PTR [esp+4], 600 ; maxlen
call _snprintf
- mov DWORD PTR [esp], ebx ; s
+ mov DWORD PTR [esp], ebx ; s
call puts
mov ebx, DWORD PTR [ebp-4]
leave
Oops, something went wrong.

0 comments on commit 9bcd72d

Please sign in to comment.