铸造清单内的空格和分页符

铸造清单内的空格和分页符

这不是重复的问题因为我在删除listing我的环境周围的环境时出现以下错误minted:错误:

! Package tikz Error: Sorry, some package has redefined the meaning of the math
-mode dollar sign. This is incompatible with tikz and its calc library and migh
t cause unrecoverable errors.

See the tikz package documentation for explanation.
Type  H <return>  for immediate help.
 ...                                              

l.17   \PYG{n+nf}{push} \PYG{n+nb}{ebp}

===========================================================================

问题

我有以下乳胶脚本:

% page 6
\sffamily
\begin{figure}[h]
  \centering
  \includegraphics[trim={1in 1in 1in 1in}, clip, scale = 0.5]{stack_block}
  \caption{stack\_block.png}
\end{figure}
\noindent
Der Stack ist inkrementiert aufgebaut. D.h., dass er von der größten zur kleinsten Adresse \textit{aufsteigt}. In der Illustration ist die Speicherplatzreservierung sowie die Operation mit Variablen gekennzeichnet. Um direkten Zugriff auf Variablen aus dem Stack zu haben, muss bevor die Variable in den Stack geschrieben wird, der \textit{Stack Bottom Pointer (EBP)} auf die aktuelle Adresse des \textit{Stack Pointers (ESP)} gesetzt werden. Anschließend wird ein beliebiger Wert per \textit{push register} in den Stack verschoben. Dabei wird der Wert aus \textit{register} an die Position \textit{ESP} geschrieben und \textit{ESP} wird um die Speichergröße von \textit{register} dekrementiert.
\newline
Nachfolgend ist ein Assembler Code, der die Operationen mit dem Stack verdeutlicht, dargestellt. Dieser ist in NASM geschrieben und für 32bit Systeme.
\ttfamily\setstretch{1.0}
\begin{listing}[ht]
\begin{minted}[
xleftmargin=0.4in,
linenos
]{nasm}
; test.asm
; TEST
; ---------
;
; nasm -f elf test.asm
; ld -m elf_i386 -s -o test test.o

section .data

section .bss

section .text
GLOBAL _start

_start:
  push ebp

  mov ebp, esp

  mov ecx, dword 01h
  push ecx

  mov eax, [ebp - 4]
  mov ebx, 01h

  mov esp, ebp
  pop ebp

  cmp ebx, eax
  je exit

  mov ebx, 1
  mov al, 1
  int 80h

 exit:
  xor ebx, ebx
  mov al, 1
  int 80h
\end{minted}
\caption{test.asm}
\end{listing}
\setstretch{1.5}

当我将代码清单放到新页面上时,它会直接从顶部开始。但在当前设置下,它看起来像:

这里

但我想要的是在文本的最后一行下方直接开始,并且代码列表应该在分页符上中断。怎么样?

编辑:示例代码

这是我的 latex 代码,您可以自己测试一下。我使用的是 xelatex,问题出现在文档末尾(最后一页)。

%%%%%%%%%%%%%%%%%%%
% compile with: xelatex --shell-escape [file.tex]
%%%%%%%%%%%%%%%%%%%

% page setup
\documentclass[10pt, letterpaper]{article}

%%%%%%%%%%%%%%%%%%%
% package imports
\usepackage{fontspec}                         % font
\usepackage[utf8]{inputenc}                   % encoding
\usepackage{minted}                           % syntax highlighting
\usepackage{fancyhdr}                         % headers/ footers
\usepackage[margin=0.89in]{geometry}          % page margins setup
\usepackage{lastpage}                         % number of last page
\usepackage{graphicx}                         % to embed graphics
\usepackage{tikz}                             % to draw geometrics
\usepackage{eso-pic}                          % add picture/background commands to each page
\usepackage{xcolor}                           % colors
\usepackage{titlesec}                         % paragraph and section formatting
\usepackage{setspace}                         % line spacing

%%%%%%%%%%%%%%%%%%%
% configurations

% font setup
\setsansfont{Ubuntu}       % Sans: Ubuntu - use \sffamily or \textsf{}
\setmonofont{Ubuntu Mono}  % typewriter: Ubuntu Mono - use \ttfamily or \texttt{}
\setmainfont[Ligatures=TeX,Scale=0.95]{Ubuntu}

% graphics path
\graphicspath{{resources/}}

% minted theme
\usemintedstyle{pastie} % monokai, add to minted options: bgcolor=bggray
% monokai: \renewcommand\theFancyVerbLine{\ttfamily\textcolor[rgb]{0.48,0.48,0.48}{\arabic{FancyVerbLine}}}
\renewcommand\theFancyVerbLine{\ttfamily\textcolor[rgb]{0,0,0}{\arabic{FancyVerbLine}}}

% color definitions
% monokai
% \definecolor{bggray}{cmyk}{0.03, 0.0, 0.15, 0.84}

% section/paragraph styling
\titleformat*{\section}{\bfseries\sffamily}
\titleformat*{\subsection}{\bfseries\sffamily}
\titleformat*{\subsubsection}{\bfseries\sffamily}
\titleformat*{\paragraph}{\bfseries\sffamily}
\titleformat*{\subparagraph}{\bfseries\sffamily}

% lists
\renewcommand\contentsname{Inhalt}
\renewcommand\listfigurename{Bilder}
\renewcommand\figurename{Bild}
\renewcommand\listoflistingscaption{Programmcodes}
\renewcommand\listingscaption{Programmcode}

\newcommand\ownit[1]{\textcolor[rgb]{0,0.28,1}{\textit{#1}}}

% line spacing
\setstretch{1.5}

% enable tikz coordinate calculation
\usetikzlibrary{calc}

% defining tab
\newcommand\tab[1][0.2in]{\hspace*{#1}}

% page borders
\AddToShipoutPictureBG{
  \begin{tikzpicture}[overlay,remember picture]
    \draw[line width=2pt]
      ($ (current page.north west) + (0.79in, -0.79in) $)
      rectangle
      ($ (current page.south east) + (-0.79in, 0.79in) $);
  \end{tikzpicture}
}

% headers/footers
\renewcommand\footrulewidth{0pt}     % footer line width
\renewcommand\headrulewidth{0pt}     % header line width
\pagestyle{fancyplain}                 % headers/footers on all pages
\lhead{\sffamily{\textbf{Exploiting Seminar}}} % left header content
\chead{}
\rhead{\sffamily{\input{"|resources/dater.sh"}}}                                        % right header content
\lfoot{\sffamily{Credits: Prutheus $\rightarrow$ www.prutheus.com / [email protected]}} % left footer content
\cfoot{}
\rfoot{\sffamily{\thepage/\pageref{LastPage}}} % right footer content

%%%%%%%%%%%%%%%%%%%
% document start
\begin{document}

% title page
\sffamily
\title{\textbf{Exploiting Seminar}}
\author{Prutheus}
\date{\input{"|resources/dater.sh"}}

\maketitle

\vspace*\fill
\begin{figure}[h]
  \flushright
  \includegraphics[trim={0 0.5in 0 0}, scale = 1.0]{sign}
\end{figure}
\begin{flushright}
  \textcolor[rgb]{0.6,0.6,0.66}{\rule{1.5in}{0.8pt}}
\end{flushright}

\newpage

% page 2
\tableofcontents
\listoffigures
\listoflistings

\newpage

% page 3
\sffamily
\section{Zusammenfassung}
In dem \ownit{Exploiting Seminar} werden grundlegende Fähigkeiten im Bereich des \ownit{Exploiting} gelehrt. Dabei wird die Funktionsweise von Programmen auf Rechnern dargestellt, sowie der Eingriff in den Prozessablauf. Um dieses Vorhaben realisieren zu können, wird Assembler-Programmierung hinsichtlicht der Erstellung von \ownit{Shellcodes} präsentiert.
\section{Ziel}
Ziel des \ownit{Exploiting Seminars} ist die Vermittlung von Kernkompetenzen im Bereich des Prozessablaufes von Programmen sowie der zielgerichtete Eingriff in die Prozessfunktionalität.

\newpage

% page 4
\sffamily
\section{Programmstart}
Bei einem \ownit{Programmstart} wird der Maschinencode eines Programms in den Arbeitsspeicher geladen und schrittweise abgearbeitet. Dabei gilt es folgende Bereiche eines Programms zu unterscheiden:
\subsection{Speichersektionen}
\subsubsection{section .data:\tab\ownit{Datenbereich}}
Im \ownit{Datenebreich} werden zum Start geladene Daten oder Konstanten deklariert. Dabei wird eine fixe Speicherregion reserviert, welche später nicht mehr expandiert werden kann. Während der Prozesslaufzeit können diese Daten nicht mehr geändert werden.
\subsubsection{section .bss:\tab\ownit{Variablenbereich}}
Im \ownit{Variablenbereich} werden Variablen deklariert. Das heißt es wird eine vordefinierte Speicherblockgröße für Daten, welche während der Prozesslaufzeit beschrieben und gelesen werden können, im Arbeitsspeicher reserviert. Diese Puffer-Speicherregion wird mit Nullen gefüllt.
\subsubsection{section .text:\tab\ownit{Programmbereich}}
Im \ownit{Programmbereich} wird der aktuelle Programmcode hinterlegt. Zu Beginn dieses Bereiches wird außerdem der Programmeinstiegspunkt für den Kernel festgelegt. Die Sektionsgröße wird fixiert, eine spätere Expansion ist nicht möglich.
\subsection{Speichersegmente}
Der Systemspeicher wird in sogenannte \ownit{Speichersegmente} aufgeteilt.
\subsection{Datensegment}
Das \ownit{Datensegment} setzt sich aus den .data und den .bss Sektionen zusammen.
\subsection{Codesegment}
Das \ownit{Codesegment} besteht aus der .text Sektion.
\subsection{Stack}
Der \ownit{Stack} beinhaltet Daten und Werte, welche im laufenden Programm zwischen Funktionsaufrufen ausgetauscht werden.

\newpage

% page 5
\sffamily
\section{Stack}
Da der Stack eine wichtige Funktion beim \ownit{Shellcoding} und \ownit{Injecting} darstellt, wird dieser nun ausführlicher betrachtet.\newline
Der Stack belegt, wie bereits erwähnt, nur einen Teil des Speichers der für die Programmausführung reserviert wird. Hier eine schematische Darstellung des gesamten Speicherblocks:
\begin{figure}[h]
  \centering
  \includegraphics[trim={1.7in 1.7in 1.7in 1.7in}, clip, scale = 0.5]{memory_block}
  \caption{memory\_block.png}
\end{figure}
\newline
Wird der Stack nun genauer betrachtet, so stellt man fest, dass dieser nochmals unterteilt ist, in einzelne \ownit{Spei-cheradressen}. Dabei ist die maximale Anzahl an Bits, die in einer Adresse hinterlegt werden können, genauso groß, wie die Rechengröße des verbauten Prozessors. Da im \ownit{Exploiting Seminar} hauptsächlich \ownit{Shellcodes} für 32bit Prozessoren entwickelt werden, ist somit die Speichergröße einer Adresse auf 32bit, also 4 Bytes bzw. einem double word (\ownit{dword}) begrenzt. Hier eine Datstellung des Stacks:

\newpage

% page 6
\sffamily
\begin{figure}[h]
  \centering
  \includegraphics[trim={1in 1in 1in 1in}, clip, scale = 0.5]{stack_block}
  \caption{stack\_block.png}
\end{figure}
\noindent
Der Stack ist inkrementiert aufgebaut. D.h., dass er von der größten zur kleinsten Adresse \ownit{aufsteigt}. In der Illustration ist die Speicherplatzreservierung sowie die Operation mit Variablen gekennzeichnet. Um direkten Zugriff auf Variablen aus dem Stack zu haben, muss bevor die Variable in den Stack geschrieben wird, der \ownit{Stack Bottom Pointer (EBP)} auf die aktuelle Adresse des \ownit{Stack Pointers (ESP)} gesetzt werden. Anschließend wird ein beliebiger Wert per \ownit{push register} in den Stack verschoben. Dabei wird der Wert aus \ownit{register} an die Position \ownit{ESP} geschrieben und \ownit{ESP} wird um die Speichergröße von \ownit{register} dekrementiert.
\newline
Nachfolgend ist ein Assembler Code, der die Operationen mit dem Stack verdeutlicht, dargestellt. Dieser ist in NASM geschrieben und für 32bit Systeme.
\ttfamily\setstretch{1.0}
\begin{listing}[h]
\begin{minted}[
xleftmargin=0.4in,
linenos
]{nasm}
; test.asm
; TEST
; ---------
;
; nasm -f elf test.asm
; ld -m elf_i386 -s -o test test.o

section .data

section .bss

section .text
GLOBAL _start

_start:
  push ebp

  mov ebp, esp

  mov ecx, dword 01h
  push ecx

  mov eax, [ebp - 4]
  mov ebx, 01h

  mov esp, ebp
  pop ebp

  cmp ebx, eax
  je exit

  mov ebx, 1
  mov al, 1
  int 80h

 exit:
  xor ebx, ebx
  mov al, 1
  int 80h
\end{minted}
\caption{test.asm}
\end{listing}
\setstretch{1.5}

%%%%%%%%%%%%%%%%%%%
% document end
\end{document}

答案1

出现此问题的原因listing是环境不允许分页符。一种选择是删除环境listing,然后\captionof从包中使用caption,这样您就可以在浮动环境之外添加标题,例如listing

tikzpicture现在,在中用于绘制框架的\AddToShipoutPictureBG和之间似乎存在某种冲突minted,或者至少minted存在跨页面的代码列表。解决该问题的一种方法可能是不使用 TikZ 作为框架,而是使用例如良好的旧picture模式。请注意,为了能够在 s\paperheight的长度中使用等\line,我加载了picture包,参见。如何在图片环境中使用 \textwidth(或任何变量)

我想到的绘制框架代码如下:

% page borders
\AddToShipoutPictureBG{%
\begin{picture}(0,0)
\linethickness{2pt}
\put(\dimexpr0.79in-1pt,0.79in){\line(1,0){\dimexpr\paperwidth-0.79in-0.79in+1pt}}
\put(0.79in,\dimexpr0.79in-1pt){\line(0,1){\dimexpr\paperheight-0.79in-0.79in+1pt}}
\put(\dimexpr0.79in-1pt,\dimexpr\paperheight-0.79in){\line(1,0){\dimexpr\paperwidth-0.79in-0.79in+1pt}}
\put(\dimexpr\paperwidth-0.79in,\dimexpr0.79in-1pt){\line(0,1){\dimexpr\paperheight-0.79in-0.79in+2pt}}
\end{picture}%

下面是完整的工作代码。我还实现了上面评论中提到的建议:

  • 删除了该inputenc软件包。xelatex(和lualatex)假定utf8,并且inputenc不应使用。

  • 删除了figure标题页上的环境。您不需要figure环境即可使用\includegraphics,似乎flushright仅环境就足够了。

  • 我没有在\sffamily每一页都添加字体(这首先是多余的,紧接着的那页\begin{document}会影响其后的所有内容),而是\renewcommand\familydefault{\sfdefault}在序言中添加了字体,将无衬线字体设置为默认值。

  • 对于代码块,我没有将其添加到前面,minted而是添加到了环境选项中。\ttfamilyfontfamily=tt

%%%%%%%%%%%%%%%%%%%
% compile with: xelatex --shell-escape [file.tex]
%%%%%%%%%%%%%%%%%%%

% page setup
\documentclass[10pt, a4paper, demo]{article}

%%%%%%%%%%%%%%%%%%%
% package imports
\usepackage{fontspec}                         % font
\usepackage{minted}                           % syntax highlighting
\usepackage{fancyhdr}                         % headers/ footers
\usepackage[margin=0.89in]{geometry}          % page margins setup
\usepackage{lastpage}                         % number of last page
\usepackage{graphicx}                         % to embed graphics
\usepackage{eso-pic}                          % add picture/background commands to each page
\usepackage{xcolor}                           % colors
\usepackage{titlesec}                         % paragraph and section formatting
\usepackage{setspace}                         % line spacing
\usepackage{caption} % for \captionof (and caption customization)
\usepackage{picture} % allows for use of lengths directly in picture-environments


%%%%%%%%%%%%%%%%%%%
% configurations

% font setup
\setsansfont{Ubuntu}       % Sans: Ubuntu - use \sffamily or \textsf{}
\setmonofont{Ubuntu Mono}  % typewriter: Ubuntu Mono - use \ttfamily or \texttt{}
\setmainfont[Ligatures=TeX,Scale=0.95]{Ubuntu}

% graphics path
\graphicspath{{resources/}}

% minted theme
\usemintedstyle{pastie} % monokai, add to minted options: bgcolor=bggray
% monokai: \renewcommand\theFancyVerbLine{\ttfamily\textcolor[rgb]{0.48,0.48,0.48}{\arabic{FancyVerbLine}}}
\renewcommand\theFancyVerbLine{\ttfamily\textcolor[rgb]{0,0,0}{\arabic{FancyVerbLine}}}

% color definitions
% monokai
% \definecolor{bggray}{cmyk}{0.03, 0.0, 0.15, 0.84}

% section/paragraph styling
\titleformat*{\section}{\bfseries\sffamily}
\titleformat*{\subsection}{\bfseries\sffamily}
\titleformat*{\subsubsection}{\bfseries\sffamily}
\titleformat*{\paragraph}{\bfseries\sffamily}
\titleformat*{\subparagraph}{\bfseries\sffamily}

% lists
\renewcommand\contentsname{Inhalt}
\renewcommand\listfigurename{Bilder}
\renewcommand\figurename{Bild}
\renewcommand\listoflistingscaption{Programmcodes}
\renewcommand\listingscaption{Programmcode}

\newcommand\ownit[1]{\textcolor[rgb]{0,0.28,1}{\textit{#1}}}

% line spacing
\setstretch{1.5}


% defining tab
\newcommand\tab[1][0.2in]{\hspace*{#1}}

% page borders
\AddToShipoutPictureBG{%
\begin{picture}(0,0)
\linethickness{2pt}
\put(\dimexpr0.79in-1pt,0.79in){\line(1,0){\dimexpr\paperwidth-0.79in-0.79in+1pt}}
\put(0.79in,\dimexpr0.79in-1pt){\line(0,1){\dimexpr\paperheight-0.79in-0.79in+1pt}}
\put(\dimexpr0.79in-1pt,\dimexpr\paperheight-0.79in){\line(1,0){\dimexpr\paperwidth-0.79in-0.79in+1pt}}
\put(\dimexpr\paperwidth-0.79in,\dimexpr0.79in-1pt){\line(0,1){\dimexpr\paperheight-0.79in-0.79in+2pt}}
\end{picture}%

}

% headers/footers
\renewcommand\footrulewidth{0pt}     % footer line width
\renewcommand\headrulewidth{0pt}     % header line width
\pagestyle{fancyplain}                 % headers/footers on all pages
\lhead{\sffamily{\textbf{Exploiting Seminar}}} % left header content
\chead{}
\rhead{\sffamily{\input{"|resources/dater.sh"}}}                                        % right header content
\lfoot{\sffamily{Credits: Prutheus $\rightarrow$ www.prutheus.com / [email protected]}} % left footer content
\cfoot{}
\rfoot{\sffamily{\thepage/\pageref{LastPage}}} % right footer content

%%%%%%%%%%%%%%%%%%%
% document start

\renewcommand\familydefault{\sfdefault}

\title{\textbf{Exploiting Seminar}}
\author{Prutheus}
\date{\input{"|resources/dater.sh"}}

\begin{document}

% title page

\maketitle

\vspace*{\fill}
\begin{flushright}
  \includegraphics[trim={0 0.5in 0 0}, scale = 1.0]{sign}

  \textcolor[rgb]{0.6,0.6,0.66}{\rule{1.5in}{0.8pt}}
\end{flushright}

\clearpage
% page 2
\tableofcontents
\listoffigures
\listoflistings

\clearpage

% page 3
\section{Zusammenfassung}
In dem \ownit{Exploiting Seminar} werden grundlegende Fähigkeiten im Bereich des \ownit{Exploiting} gelehrt. Dabei wird die Funktionsweise von Programmen auf Rechnern dargestellt, sowie der Eingriff in den Prozessablauf. Um dieses Vorhaben realisieren zu können, wird Assembler-Programmierung hinsichtlicht der Erstellung von \ownit{Shellcodes} präsentiert.

\section{Ziel}
Ziel des \ownit{Exploiting Seminars} ist die Vermittlung von Kernkompetenzen im Bereich des Prozessablaufes von Programmen sowie der zielgerichtete Eingriff in die Prozessfunktionalität.



% page 4
\section{Programmstart}
Bei einem \ownit{Programmstart} wird der Maschinencode eines Programms in den Arbeitsspeicher geladen und schrittweise abgearbeitet. Dabei gilt es folgende Bereiche eines Programms zu unterscheiden:

\subsection{Speichersektionen}
\subsubsection{section .data:\tab\ownit{Datenbereich}}

Im \ownit{Datenebreich} werden zum Start geladene Daten oder Konstanten deklariert. Dabei wird eine fixe Speicherregion reserviert, welche später nicht mehr expandiert werden kann. Während der Prozesslaufzeit können diese Daten nicht mehr geändert werden.

\subsubsection{section .bss:\tab\ownit{Variablenbereich}}
Im \ownit{Variablenbereich} werden Variablen deklariert. Das heißt es wird eine vordefinierte Speicherblockgröße für Daten, welche während der Prozesslaufzeit beschrieben und gelesen werden können, im Arbeitsspeicher reserviert. Diese Puffer-Speicherregion wird mit Nullen gefüllt.

\subsubsection{section .text:\tab\ownit{Programmbereich}}
Im \ownit{Programmbereich} wird der aktuelle Programmcode hinterlegt. Zu Beginn dieses Bereiches wird außerdem der Programmeinstiegspunkt für den Kernel festgelegt. Die Sektionsgröße wird fixiert, eine spätere Expansion ist nicht möglich.

\subsection{Speichersegmente}
Der Systemspeicher wird in sogenannte \ownit{Speichersegmente} aufgeteilt.

\subsection{Datensegment}
Das \ownit{Datensegment} setzt sich aus den .data und den .bss Sektionen zusammen.

\subsection{Codesegment}
Das \ownit{Codesegment} besteht aus der .text Sektion.

\subsection{Stack}
Der \ownit{Stack} beinhaltet Daten und Werte, welche im laufenden Programm zwischen Funktionsaufrufen ausgetauscht werden.

% page 5
\section{Stack}
Da der Stack eine wichtige Funktion beim \ownit{Shellcoding} und \ownit{Injecting} darstellt, wird dieser nun ausführlicher betrachtet.\newline
Der Stack belegt, wie bereits erwähnt, nur einen Teil des Speichers der für die Programmausführung reserviert wird. Hier eine schematische Darstellung des gesamten Speicherblocks:
\begin{figure}[h]
  \centering
  \includegraphics[trim={1.7in 1.7in 1.7in 1.7in}, clip, scale = 0.5]{memory_block}
  \caption{memory\_block.png}
\end{figure}
Wird der Stack nun genauer betrachtet, so stellt man fest, dass dieser nochmals unterteilt ist, in einzelne \ownit{Spei-cheradressen}. Dabei ist die maximale Anzahl an Bits, die in einer Adresse hinterlegt werden können, genauso groß, wie die Rechengröße des verbauten Prozessors. Da im \ownit{Exploiting Seminar} hauptsächlich \ownit{Shellcodes} für 32bit Prozessoren entwickelt werden, ist somit die Speichergröße einer Adresse auf 32bit, also 4 Bytes bzw. einem double word (\ownit{dword}) begrenzt. Hier eine Datstellung des Stacks:



% page 6
\begin{figure}[h]
  \centering
  \includegraphics[trim={1in 1in 1in 1in}, clip, scale = 0.5]{stack_block}
  \caption{stack\_block.png}
\end{figure}


Der Stack ist inkrementiert aufgebaut. D.h., dass er von der größten zur kleinsten Adresse \ownit{aufsteigt}. In der Illustration ist die Speicherplatzreservierung sowie die Operation mit Variablen gekennzeichnet. Um direkten Zugriff auf Variablen aus dem Stack zu haben, muss bevor die Variable in den Stack geschrieben wird, der \ownit{Stack Bottom Pointer (EBP)} auf die aktuelle Adresse des \ownit{Stack Pointers (ESP)} gesetzt werden. Anschließend wird ein beliebiger Wert per \ownit{push register} in den Stack verschoben. Dabei wird der Wert aus \ownit{register} an die Position \ownit{ESP} geschrieben und \ownit{ESP} wird um die Speichergröße von \ownit{register} dekrementiert.


Nachfolgend ist ein Assembler Code, der die Operationen mit dem Stack verdeutlicht, dargestellt. Dieser ist in NASM geschrieben und für 32bit Systeme.

\begin{minted}[
xleftmargin=0.4in,
linenos,
fontfamily=tt
]{nasm}
; test.asm
; TEST
; ---------
;
; nasm -f elf test.asm
; ld -m elf_i386 -s -o test test.o

section .data

section .bss

section .text
GLOBAL _start

_start:
  push ebp

  mov ebp, esp

  mov ecx, dword 01h
  push ecx

  mov eax, [ebp - 4]
  mov ebx, 01h

  mov esp, ebp
  pop ebp

  cmp ebx, eax
  je exit

  mov ebx, 1
  mov al, 1
  int 80h

 exit:
  xor ebx, ebx
  mov al, 1
  int 80h
\end{minted}
\captionof{listing}{test.asm}



%%%%%%%%%%%%%%%%%%%
% document end
\end{document}

输出的最后两页:

在此处输入图片描述

相关内容