問題タブ [yasm]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
assembly - YASM または NASM アセンブリでバックスペースを実行する
raw モードで文字を読み取るプログラムがあります。つまり、入力された文字はバッファリングされるのではなく、すぐに読み取られます。
バックスペースを実行する方法を知りたいです。つまり、Backspace キーを押すと、左側の文字が削除され、カーソルが 1 つ左に移動します。
バックスペース文字に続いてスペース文字を出力しようとしました。これにより、左側の文字が削除されますが、何らかの理由でカーソルが2スペース右に移動します。
また、バックスペース文字を単独で出力しようとしました。これにより、カーソルが 1 スペース左に移動しますが、文字は削除されません。
私のアセンブラは YASM で、64 ビット Linux を使用しています。以下は関連するコードです。
まず、文字を出力するために使用する関数は次のとおりです。
次のコードは、Backspace を出力します。通常の Backspace のように、カーソルを 1 か所左に移動しません。
このコードは、Backspace の後に Space を出力します。カーソルを 1 つではなく 2 つ右に移動します。
Len は、バックスペース、スペース、バックスペースの順に印刷することを提案しました。これはうまくいくようです:
前に述べたように、私は raw モードで文字を読んでいることに注意してください。前もって感謝します!
assembly - 2rd、oword、yword オペランドのサイズは?
NASM / YASM マニュアルtword
で使用されている、oword
およびyword
オペランドのサイズは? それに関連して、これらの名前にはトリックや根底にあるアイデアはありますか? より大きなワードサイズに論理名を付ける方法はありますか?
ワード サイズはシステム間で異なる場合がありますが、NASMword
は 2 バイトで、dword
その 2 倍 (4 バイト) でqword
、クワッド ワード (8 バイト) ですが、...tword
トリプルワード(6 バイト) ですか? そしてoword
、yword
私はもっともらしい意味さえ考えられません。
おそらく簡単な質問ですが、答えが見つかりませんでした。NASM および YASM のマニュアルでは、これらのサイズは説明されておらず、 、 、 、 、疑似命令でも説明さDQ
れDT
てDY
いRESQ
ませREST
んRESY
。MASMが同様のシステムを使用していることをどこかで読みましたが、それについても何も見つかりませんでした.
編集:回答に基づいて、これは完全なリストです:
- 1 バイト (8 ビット):
byte
、DB
、RESB
- 2 バイト (16 ビット):
word
、DW
、RESW
- 4 バイト (32 ビット):
dword
、DD
、RESD
- 8 バイト (64 ビット):
qword
、DQ
、RESQ
- 10 バイト (80 ビット):
tword
、DT
、REST
- 16 バイト (128ビット) :
oword
、、、、DO
RESO
DDQ
RESDQ
- 32 バイト (256 ビット):
yword
、DY
、RESY
- 64 バイト (512 ビット):
zword
、DZ
、RESZ
linux - Linux 64 ビット Intel (x86-64) アセンブリで、バッファーに収まらない stdin 入力がシェルに送信されるのを回避する方法
編集: @Gunnerがこれはバッファオーバーフローではないことを指摘したため、タイトルが変更されました。
stdin
Linux 64 ビット Intel アセンブリからユーザー入力を読み取るNR_read
際に、入力バッファーに収まらない入力が Linux シェルに送信されるのをどのように回避できるのでしょうか。バッシュ?たとえば、このサンプル プログラムでは、255 バイトの入力バッファーを定義しました (バッファーのサイズは >= 1 であれば何でもかまいません)。残りの 255 バイトを超える入力は bash に送信され (bash から実行している場合)、これは明らかに重大な脆弱性です。この脆弱性を回避するには、Linux 64 ビット アセンブリで入力をどのように読み取る必要がありますか?
これが私のコードです:
assembly - YASM/NASM Hello World のビルドで問題が発生しました
hello.asmを Windows 実行可能ファイルにビルドしようとしていますが、推奨されるコマンドを使用してコードをアセンブル、リンク、およびコンパイルすると、エラーが発生します。Strawberry Perlの GCCを使用しているかMinGWの GCC を使用しているかにかかわらず、どちらも同じ YASM/NASM コードに対してエラーを返します。
ここに痕跡があります。Makefile または .ASM で何か間違ったことを行っているか、リンク プロセスにバグがあります。いずれにせよ、誰かにエラーの解決を手伝ってもらいたいです。
nasm と yasm のどちらを使用してオブジェクト ファイルをアセンブルしても、同じ結果が得られます。
ストロベリー Perl GCC トレース:
MinGW GCC トレース:
仕様:
- YASM 1.2.0
- NASM 2.10.05
- ストロベリーパール gcc 4.4.3
- MinGW gcc 4.5.2
- ストロベリーパール5.12
- MinGW 0.1
- Windows 7 プロフェッショナル x64
- MacBook Pro 2009
macos - MacOSMountainLionのyasmを使用したシンプルなasmプログラム
非常に単純なプログラムを64ビットでコンパイルして実行したいと思います。
それをコンパイルする行:
また、別の形式で試しましたが、macho[|32|64], elf[|32] bin
どれも成功しませんでした。
それをリンクする行:
gcc
また、などのいくつかのオプションを試してみました-m64 -arch x86_64
。
makefile - Makefile エラー - make: *** `all' が必要とするターゲット `boot.o' を作成するルールがありません。止まる
私は unix のようなカーネル開発チュートリアルに取り組んでいますが、完全な初心者の問題に遭遇したと確信しています。これの何が問題なのか誰か教えてもらえますか?
前もって感謝します
assembly - Intel構文で64ビットコードをコンパイルするYasm
私はこのファイルを持っています:
これは、次のディレクティブを使用して yasm で適切にコンパイルされます。
私の質問は: intel 構文を使用して nasm パーサーを使用して 64 ビット コードをコンパイルする方法はありますか? AT&T 構文があまり好きではない
macos - Mac OS X:YASM:エラー:マッチョ:申し訳ありませんが、64モードでは32ビットの絶対再配置を適用できません
NASMは問題なくコンパイルされますが、YASMを使用すると、次のエラーが発生します。
hello.asm:12:エラー:マッチョ:申し訳ありませんが、64ビットモードでは32ビットの絶対再配置を適用できません。memアクセスには「[_symbolwrt rip]」、ポインタには「qword」と「dq_foo」を検討してください。
Makefile
system.inc
hello.asm
誰が何が起こっているのか知っていますか?そして、NASMが機能する理由を説明できても、YASMが機能しない場合は、それはボーナスになります。
x86 - x86: メモリ アドレスに移動するときにキャリー フラグが設定されないのはなぜですか?
これはダップのように見えるかもしれませんが、私の質問のようなものは見つかりませんでした. 私がyasmに持っているとしましょう:
に移動するときにキャリーフラグが設定されないのはなぜですか? バイトだけです!私が明らかにそれに移動したとき、バイトよりもはるかに大きくなります。実際、gdb では、数値全体が a に格納されます。その宣言を考えると、それはどのように可能ですか?
assembly - VSYASMでのwin64アンワインドデータディレクティブの使用
コードはすべて正常に機能しましたが、巻き戻しデータを作成するためのディレクティブを追加すると、YASMはコードのアセンブルを拒否し始めました。
自動生成されたコマンドラインの「-fx64」で証明されているように、ビルド設定はx64用です。"C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\"vsyasm.exe -Xvc -f x64 -o "x64\Debug\\" -l "" -P "" --mapdir= "" -E "" --prefix "" --suffix "" -rnasm -pnasm -m amd64
通常、-m
スイッチはそこにありませんが、私はそれを適切に追加しました。それは役に立ちませんでした。
-f
スイッチの引数をに変更しても、次のwin64
いずれにも役立ちません。"C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\"vsyasm.exe -Xvc -f win64 -o "x64\Debug\\" -l "" -P "" --mapdir= "" -E "" --prefix "" --suffix "" -rnasm -pnasm -m amd64
このコードでは、
proc_frame
VSYASMは、関数ラベルの再定義について不平を言います。これは、おそらく、ディレクティブとして認識されなかったことを意味します。それはまた言いますerror: unrecognized directive 'alloc_stack'
そして同じですsave_xmm128
。について文句はありませんendprolog
。
角かっこで囲むproc_frame
と最初のエラーはなくなりますが(ラベルの再定義)、マニュアルには角かっこなしで使用するように記載されており、とにかく問題は解決しません。
これを修正するにはどうすればよいですか?できれば、適切な巻き戻しデータを作成する方法で。