[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 2chのread.cgiへ]
Update time : 06/06 15:11 / Filesize : 188 KB / Number-of Response : 881
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

アセンブラ… (゜□゜) ↑アッー!↓



1 名前:デフォルトの名無しさん [2006/05/24(水) 01:43:34 ]
アセンブラ全般に関するスレッドです。

【前スレ】
アセンブラ… ヽ(゚∀゚)ノフォーウ!
pc8.2ch.net/test/read.cgi/tech/1132761638/

過去ログは>>2辺り

411 名前:デフォルトの名無しさん mailto:sage [2006/08/24(木) 08:53:48 ]
で、答えたら、次のバイトは何ですかとなるわけだな!

412 名前:デフォルトの名無しさん mailto:sage [2006/08/24(木) 09:00:33 ]
00400000 4D 5A 50 00 02 00 00 00 04 00 0F 00 FF FF 00 00 MZP........
00400010 B8 00 00 00 00 00 00 00 40 00 1A 00 00 00 00 00 ク.......@......
00400020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00400030 00 00 00 00 00 00 00 00 00 00 00 00 50 00 00 00 ............P...
00400040 0E 1F BA 0E 00 B4 09 CD 21 B8 01 4C CD 21 2E 24 コ.エ.ヘ!クLヘ!.$

超適当

413 名前:デフォルトの名無しさん mailto:sage [2006/08/24(木) 09:28:55 ]
とりあえずVC++でもリンカオプションいじれば1024バイトまでは達成できることを確認。

414 名前:デフォルトの名無しさん mailto:sage [2006/08/24(木) 10:59:44 ]
/NODEFAULTLIBと/ENTRYと/MERGEと/OPT:WIN98で512バイトは可能

415 名前:デフォルトの名無しさん mailto:sage [2006/08/24(木) 11:33:14 ]
ファイルのアラインメントサイズって512以下にできるんだっけ?

416 名前:デフォルトの名無しさん [2006/08/24(木) 13:56:04 ]
         _____
   _  /      \
  |  |/  _ノ  ヽ、_  \   ・・・もしもしお母さん、僕だお、僕・・・そう、ヨシオだお・・・
  |  |  o゚⌒   ⌒゚o  \  ・・・事故起こしちゃって・・・相手を怪我させちゃったお・・・
  |  |    (__人__)    |  

  |  |/  _ノ  ヽ、_  \   ・・・お金がいっぱい必要だけどお金持ってないお・・・
  |  |  o゚⌒   ⌒゚o  \  ・・・うん・・・うん・・・今から言う口座にすぐ振り込んで欲しいお・・・
  |  |    (__人__)    |  

  |  |/  _ノ  ヽ、_  \   ・・・お母さん・・・迷惑かけてばかりでごめんなさい・・・
  |  |  o゚⌒   ⌒゚o  \  ・・・うん・・・ありがとう・・・がんばるお・・・じゃあね・・・
  |  |    (__人__)    |  

プチッ…  _  /      \
 ツーツー…|  |/  _ノ  ヽ、_  \   ・・・
      |  |  o゚⌒   ⌒゚o  \
      |  |    (__人__)    |  
      |_|     ` ⌒´     /
       §
      ∂
         __
   _   /⌒  ⌒\
  |  |/( ●)  (●)\
  |  |::::::⌒(__人__)⌒::::: \
  |  |    |r┬-|     |
  |_|      `ー'´     /
   §
  ∂
 ∽


417 名前:デフォルトの名無しさん mailto:sage [2006/08/24(木) 14:14:01 ]
バイナリエディタで作れる最小のPEは256バイトより若干小さくできるけど
不正なexeで認識する環境もある

418 名前:デフォルトの名無しさん [2006/08/24(木) 17:00:20 ]
256バイトより若干小さいそのEXEはPEフォーマットに従ったものですか?
普通のWindowsのEXE(Notepad.exeなど)はOEではなくOMFですか?
>>412
00400000 4D 5A 50 ←これ何ですか( ^ω^)

419 名前:デフォルトの名無しさん mailto:sage [2006/08/24(木) 17:22:18 ]
ちなみに、4096byteより小さくしても、通常は意味がない。

というのは、ページサイズが4Kな上、
FAT32もNTFSも、普通はクラスタサイズが4K以上だから。
FAT16(FDDとか)を使うとか、ネット上での転送量を気にするとかなら
わずかに意味があるかもしれないが
それ以外は、ただの自己満足。



420 名前:デフォルトの名無しさん mailto:sage [2006/08/24(木) 17:30:02 ]
>>418
PEヘッダへのオフセットの最下位バイト。

421 名前:デフォルトの名無しさん mailto:sage [2006/08/24(木) 17:46:25 ]
>419
>ネット上での転送量
普通圧縮かけるから結局無意味。

てか、サイズを小さくする目的でアセンブラ使ってる人はもう居ないでしょ。
組み込み系ですら見かけない。

422 名前:デフォルトの名無しさん mailto:sage [2006/08/24(木) 18:00:30 ]
FDDはFAT12だった。
と、突っ込みが入る前に訂正しておこう。

423 名前:デフォルトの名無しさん mailto:sage [2006/08/24(木) 18:18:28 ]
288バイトでアッー!

TVpQuzAAQABTU1BLU+sDAAAA/yUcAEAAHAAAAPAAAAAAAAAA4AAAABwAAAAAAADDg0GDYoFbgUkA
AAAAQAAAAFBFAABMAQEAAAAAAAAAAAAAAAAA4AAPAQsBBQyAAAAAAAAAAAAAAAACAAAAAAAAAOAB
AAAAAEAAEAAAABAAAAAEAAAAAAAAAAQAAAAAAAAA4AEAAGABAAAAAAAAAgAAAAAAEAAAEAAAAAAQ
AAAQAAAAAAAAEAAAAAAAAAAAAAAAGAAAACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c2Vy
MzIuZGxsAAAAAAAAnQFNZXNzYWdlQm94QQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAAE
AAAA

424 名前:デフォルトの名無しさん [2006/08/25(金) 09:17:03 ]
>>420
その素敵な日本語は飽きるほど見ました。
もーそこは分かりました( ^ω^)
>>412
それは実行可能ですか?

425 名前:デフォルトの名無しさん mailto:sage [2006/08/25(金) 09:30:59 ]
DOS STUBとPEヘッダの間にリンカが埋めるデータの意味が未だにわからん
クリアしても動作に支障はないし

426 名前:デフォルトの名無しさん mailto:sage [2006/08/25(金) 10:16:29 ]
必ずRichって書いてあるよな

>>423
アッー!


427 名前:デフォルトの名無しさん mailto:sage [2006/08/25(金) 10:38:27 ]
前に1000バイトのテトリス(Win32アプリ)を見たな‥‥

428 名前:デフォルトの名無しさん mailto:sage [2006/08/25(金) 16:20:52 ]
>>427
これか?
昔は動いたけどXPSP2だと動かないっぽい・・・

TVpHZGkzMi5kbGwAQWRqdXN0V2luZG93UmVjdABDcmVhdGVXaW5kb3dFeEEAU2V0V2luZG93TG9u
Z0EAQAAAAFBFAABMAQEAuzQRQACJ2DHJ6xmQaAAPAQsBU3RyZXRjaERJQml0cwBIAAAAsWyNPAuQ
6wwAAEAAABAAAAACAACxF6uDxyjrEAQAAAAAAAAAABAAAYQDAACrkOsCAgDrEAAAEAAAEAAAAAAQ
AAAQAADi0OskAgAAAAAAAAAAAAAAXBEAADwAAAAAAAABABAAAIQBAAAAAgAAagBoAADIEI1zUOsE
4AAA4LEM86vGRgh4xkYM5Fb/UwhqAGgAAEAAagBqAItGDCtGBFCLRggrBlBqIGogaAAAyBBqAGgU
A0AAagD/Uwxo1wFAAGr8UFD/UxiJQ1T/UxCNs+wEAABqAGoAagBW/1MchcB0Blb/UyDr7MONkywB
AAAxwLDYMe2xC40sCIssqoXtdALi9IXJdROJxY08qo130LEM86WD7Qx98evZg+gMfdSNU2CLAkCD
+AZ+AjHAiQLHQ2Tt////iwqLRIvkiUNoU1ZXg8NQjXMYMcAxybEEi1MUD74+RgH6jZST3AAAAAsC
i3sQi3y7lDE64uNfXlvDYLs0EUAAi3QkKIP+AnUFagD/UyQx/4P+D3QVgf4AAQAAdQaLfCQs6wdh
/yVIEUAAaKcBQAD/c2iNc2SLLv9UJASNU1yLi/wEAACJyCsCg+h/fgaJCjH/6z2D/yZ1JWCLS2CF
yXQcjXtosQQPvgdQmTHbswn3+2vYkVhrwAwp2Kri6WGD/yV1Av8Og/8ndQL/BoP/KHUDgwYM/1Qk
BIXAdBr/VCQEiWtkiwQkiUNo/1QkBIX/dQXowP7//4PECGggAMwAagBoAANAAI2DLAEAAFBqE2oK
agFqAWjkAAAAanhqAGoA/3NU/xNhwhAARGVmV2luZG93UHJvY0EAR2V0TWVzc2FnZUEARGlzcGF0
Y2hNZXNzYWdlQQBQb3N0UXVpdE1lc3NhZ2UAKAAAAAwAAADs////AQAgAAMAAABFRElUAAEMDQAB
Cwz/AAEN/wAMDf8AAf4A/wELAAH/DFgAAAAAAAAACgAAABsAAAArAAAAwgIAAF4DAADRAgAA3QIA
AO4CAAAAAAAAR2V0REMAAAACAAAANBEAAFVzZXIzMi5kbGwAAHADAAA8EQAA

429 名前:デフォルトの名無しさん [2006/08/25(金) 17:07:20 ]
>>409
セクションとはassumeのことですか?
csとdsを同じにしたらEXEではなくなるんじゃないですか( ^ω^)



430 名前:デフォルトの名無しさん mailto:sage [2006/08/25(金) 19:15:35 ]
やっとできたー
たぶんPEの最小サイズ?

TVoAAFBFAABMAQEATWVzc2FnZUJveEEAqAAPAQsBdXNlcjMyLmRsbAAxwLkpAAAAUGjEAEAA6yYA
AEAABAAAAAQAAAAKAAAAAAAAAAQAAAAAAAAA6QAAAMQAAADMzOtcAgAAAAAAEAAAAAEAAAAQAAAA
AQAAAAAAAgAAAAAAAAAAAAAAqAAAABQAAACBQIFpgUCDqV+DqQqBvIHcgsLfgVvfKYLCgfQARAAA
AAAAAAAAAAAAHgAAAEQAAABojABAAFDrHDIzM2J5dGUA6QAAAAAAAADpAAAAAAAAAAAAAAD/FUQA
QADDzCA=

431 名前:デフォルトの名無しさん mailto:sage [2006/08/25(金) 20:02:15 ]
233が最小だと思ってたけどもう少し小さくできそうだ・・・

432 名前:デフォルトの名無しさん mailto:sage [2006/08/26(土) 01:29:13 ]
>>406

433 名前:デフォルトの名無しさん mailto:sage [2006/08/28(月) 01:32:20 ]
>>428はXPSP2と2003SP1だと動かないねぇ‥‥
>>430のは動くけど。

434 名前:デフォルトの名無しさん mailto:sage [2006/08/29(火) 00:28:35 ]
>>429
Win32のEXEはCS=DSが普通だし、
DOSのEXEもスモールモデルはCS=DS。

COMでもCS≠DSにすることは不可能ではないけどちと話がずれるな。

435 名前:デフォルトの名無しさん mailto:sage [2006/08/29(火) 03:25:13 ]
スモールモデルはCS≠DSだったと記憶してるが・・・

436 名前:デフォルトの名無しさん mailto:sage [2006/08/29(火) 03:46:13 ]
CS=DSはCOMだろ。

437 名前:デフォルトの名無しさん mailto:sage [2006/08/29(火) 04:06:28 ]
CS=DSはタイニーだな。

438 名前:デフォルトの名無しさん mailto:sage [2006/08/29(火) 07:32:27 ]
MASMでスタックサイズを指定するにはどうしたらよいですか?
_MessageBoxA@16だけだからスタックは16バイトでよいですか?

439 名前:デフォルトの名無しさん mailto:sage [2006/08/29(火) 13:31:19 ]
nasmとmasm32 があるけど使い方がわかりません。

hello worldと表示させる.asmはあるのですが
このあとnasmやmasm32 を使って helloworld
を表示する方法をおしえていただけませんか?




440 名前:デフォルトの名無しさん mailto:sage [2006/08/30(水) 01:54:52 ]
>>434
Win32だとCS=0x1b、DS=0x23だったような。ollydbgで確認。

441 名前:デフォルトの名無しさん mailto:sage [2006/08/30(水) 10:08:45 ]
>>440
わかっているくせに

442 名前:デフォルトの名無しさん mailto:sage [2006/08/30(水) 19:27:08 ]
>>441
キョン君のこと好きなんでしょ

443 名前:デフォルトの名無しさん mailto:sage [2006/08/30(水) 20:12:51 ]
でも象さんの方がもっと好きです

444 名前:デフォルトの名無しさん mailto:sage [2006/08/30(水) 23:55:52 ]


    にら

445 名前:デフォルトの名無しさん mailto:sage [2006/08/30(水) 23:58:34 ]
れば

446 名前:デフォルトの名無しさん mailto:sage [2006/08/31(木) 00:01:32 ]
かゆ…

447 名前:デフォルトの名無しさん mailto:sage [2006/08/31(木) 00:06:38 ]
うまい、うますぎる。

448 名前:デフォルトの名無しさん mailto:sage [2006/08/31(木) 01:43:30 ]
風が語りかけます。

449 名前:デフォルトの名無しさん mailto:sage [2006/08/31(木) 06:09:19 ]
アッー!




450 名前:デフォルトの名無しさん mailto:sage [2006/08/31(木) 11:47:38 ]
十万行アセンブラ

451 名前:デフォルトの名無しさん mailto:sage [2006/08/31(木) 14:04:48 ]
おえーおえー

452 名前:デフォルトの名無しさん [2006/08/31(木) 19:25:35 ]
eax:edx の内容を mm0 に転送するにはどう書いたらいいんでしょうか?

453 名前:・∀・)っ-○◎●新世紀ダンゴリオン ◆DanGorION6 mailto:sage [2006/08/31(木) 23:18:23 ]
movd mm0, eax
movd mm1, edx
punpckldq mm0, mm1

454 名前:デフォルトの名無しさん [2006/09/01(金) 08:32:02 ]
VC6 で アセンブラの pmovmskb 命令を使用するにはどうしたらいいんでしょうか?

455 名前:デフォルトの名無しさん [2006/09/01(金) 08:47:59 ]
つ[VC2005 Express]

456 名前:デフォルトの名無しさん mailto:sage [2006/09/01(金) 08:57:19 ]
2500バイト未満のMessageBoxのMZってどうやって作るんですか?

457 名前:デフォルトの名無しさん mailto:sage [2006/09/01(金) 09:44:06 ]
>>456
アセンブラでMessageBox呼び出しだけでどうやったら2499バイトを超える事ができるのかが逆に疑問だ

458 名前:デフォルトの名無しさん mailto:sage [2006/09/01(金) 09:56:15 ]
表示するメッセージが2500バイト以上なんだろw

459 名前:デフォルトの名無しさん mailto:sage [2006/09/01(金) 10:38:37 ]
それだ!



460 名前:デフォルトの名無しさん [2006/09/08(金) 11:39:40 ]
gas/i386で

pushl %ds

こういう命令が書かれてたとき、
スタックポインタに加算される値は2?それとも4?

461 名前:デフォルトの名無しさん mailto:sage [2006/09/08(金) 12:14:16 ]
4に決まってるだあ

462 名前:デフォルトの名無しさん mailto:sage [2006/09/08(金) 12:29:38 ]
さんくすこ

463 名前:デフォルトの名無しさん mailto:sage [2006/09/20(水) 19:19:17 ]
『独習アセンブラ』で、今日からやりだした超初心者なんですけど、
x86系Linuxのnasmで ”1”の文字 一文字表示しようと思うのですが、

$ nasm -f elf hajime.asm
$ ld -s -o hajime hajime.o
でアセンブルもリンクも問題なくできるのですけど、

$ ./hajime [Enter]
$
セグメンテーション違反です

って表示され叱られてしまいました! どなたかご教示願いないでしょうか。

ソースは以下のようになってます。nasmは、 nasm-0.98.39を使ってます。

global _start

_start:
mov eax, 31h ; 文字 "1"
push eax ; スタックにバッファを設定
mov eax, 4 ; 出力(sys_wrigte)
mov ebx, 1 ; ファイルハンドル(1=標準出力)
mov edx, 1 ; 1文字出力することを指定
mov ecx, esp ; 書き込むバッファ
int 0x80 ; 出力する
pop eax

464 名前:デフォルトの名無しさん mailto:sage [2006/09/20(水) 20:15:23 ]
プログラムの終端でのエラーではないでしょうか。
最後にプログラム終了の命令を追加してみてください。

mov eax, 1 ; sys_exit
mov ebx, 0 ; 終了ステータスコード
int 0x80

465 名前:デフォルトの名無しさん [2006/09/20(水) 21:10:58 ]
>>464
早速のご教示、ありがとうございます。

書かれている命令を追加してみましたが、結果は変わりませんでした。
『独習アセンブラ』に書かれている、次のサンプル「Hallo assembler」の方はキチンと表示
されるのに一番最初のサンプルコードがトラブってしまって、まいってます!

466 名前:( ^ω^)飛来ブーン [2006/09/20(水) 21:23:16 ]
あげ

467 名前:デフォルトの名無しさん mailto:sage [2006/09/20(水) 21:29:56 ]
linux nasm>Google
で最初に出るサイトのasm05.htmlに似たようなのがある
push eaxの前にpusha、pop eaxの後にpopaを入れてみてはどう?


468 名前:デフォルトの名無しさん mailto:sage [2006/09/20(水) 21:58:02 ]
>>467
pusha、pop を入れてみましたが、結果は、まったく変わりません。
コードを書き足しているのにまったく変わらないというのも
何か、おもしろいですね。


469 名前:デフォルトの名無しさん mailto:sage [2006/09/20(水) 22:08:54 ]
pusha、popa は不要。

global _start

_start:
mov eax, 31h ; 文字 "1"
push eax ; スタックにバッファを設定
mov eax, 4 ; 出力(sys_wrigte)
mov ebx, 1 ; ファイルハンドル(1=標準出力)
mov edx, 1 ; 1文字出力することを指定
mov ecx, esp ; 書き込むバッファ
int 0x80 ; 出力する
pop eax
mov eax, 1 ; sys_exit
mov ebx, 0 ; 終了ステータスコード
int 0x80

で動作したよ。nasm-0.98 と nasm-0.98.38 で確認。



470 名前:463 mailto:sage [2006/09/20(水) 22:30:17 ]
>>469
家では、やはり「 セグメンテーション違反です」が出てしまいます orz
先ほども書きましたが、次のサンプルコードの「Hello assembler」は順調に
アセンブルもリンクも 実行もウマクいくんですけど …

nasm-0.98.38 をgetして、コンパイルし直してみます。
みなさん、Thanks

471 名前:デフォルトの名無しさん mailto:sage [2006/09/20(水) 22:54:40 ]
int 0x80 を int 0x08 とタイプミスしてました、な〜んてことはないよね?
いや、恥ずかしながら俺がそうだった。
見つけたときは全身脱力したよ。俺の1週間は何だったんだってね。

472 名前:デフォルトの名無しさん mailto:sage [2006/09/20(水) 22:58:24 ]
> 全身脱力

全身脱毛に見えた

473 名前:463 mailto:sage [2006/09/20(水) 23:28:07 ]
>>471
私もint 0x08をサンプルの「Hello assembler」の方でやってしまいました。
これやると、「 セグメンテーション違反です」がモロ出るんですよね。

今、 nasm-0.98.38 をgetしてきましたが、今度は、nasmのコンパイルが通らない!
泥沼に嵌まりこんでしまいました。 orz

474 名前:デフォルトの名無しさん mailto:sage [2006/09/20(水) 23:38:48 ]
>>473
ttp://prdownloads.sourceforge.net/nasm/nasm-0.98.39-1.i386.rpm?download
$ rpm -Uvh nasm-0.98.39-1.i386.rpm

475 名前:デフォルトの名無しさん mailto:sage [2006/09/20(水) 23:47:42 ]
$ apt-get install nasm

476 名前:デフォルトの名無しさん mailto:sage [2006/09/21(木) 02:47:09 ]
>>473
nasmのコンパイルが通らないとは
nasm自体のソースコードがコンパイルできないということですか?
でしたら>>474,475などで解決できると思うのですが。
それともnasmのインストールは完了していて、サンプルコードがアセンブルできない
ということですか?

477 名前:463 mailto:sage [2006/09/21(木) 06:40:38 ]
>>476
おはようございます。

私の場合は、nasmをソースからコンパイルしてinstallしています。
nasm-0.98.39.tar.bz2を展開してコンパイルして使いだしていたのですが、
nasm-0.98.38を使ってる人>>469でのアセンブリのソースコードが問題なく
アセンブルが通るということなのでnasm-0.98.38.tar.bz2をゲットしてコンパイル
したという訳なんです。

478 名前:463 mailto:sage [2006/09/21(木) 12:37:21 ]
お騒がせいたしました。自己解決しました。
ソース↓

section .data ; セグメンテーション違反回避
global _start

_start:
mov eax, 31h ; 文字 "1"
push eax ; スタックにバッファを設定
mov eax, 4 ; 出力(sys_wrigte)
mov ebx, 1 ; ファイルハンドル(1=標準出力)
mov edx, 1 ; 1文字出力することを指定
mov ecx, esp ; 書き込むバッフ
int 0x80 ; システムコール,出力する

mov eax, 0ah ; 0ah
push eax ;
mov eax, 4 ; は
mov ebx, 1 ; 改
mov edx, 1 ; 行
mov ecx, esp ; 用
int 0x80 ; システムコール,改行する
pop eax ; eaxの回収

mov eax, 1 ; sys_exit
mov ebx, 0 ; 終了ステータスコード
int 0x80 ; システムコール,終了する

479 名前:デフォルトの名無しさん mailto:sage [2006/09/21(木) 13:53:05 ]
それは駄目。
.dataセクションにはグローバル変数等を配置することになっているので、
そこにコードを記述することはできない。
コードを配置するのは.textセクション。

スタックにバッファを置くために2回pushしているが、1回しかpopしていない。

それから改行を出力するために苦労した痕が見受けられるが、次のように
すればプログラムを短縮できる。

mov eax, 0x0a31
push eax
mov eax, 4
mov ebx, 1
mov edx, 2
mov ecx, esp
int 0x80
pop eax




480 名前:デフォルトの名無しさん [2006/09/22(金) 02:03:54 ]
フロッピーからデータの読みだしについてです。
シリンダ0番、セクタ2番のプログラムを0x8000に読みだして実行
したいのです。
最後のJMPで*を付けると実行出来ないのですが、理由を教えて下さい。

MOVW $0x800, %AX
MOVW %AX, %ES

MOVB $0x00, %CH
MOVB $0x02, %CL
MOVB $0x00, %DH
MOVB $0x00, %DL

MOVB $0x02, %AH
MOVB $0x01, %AL
INT $0x13

JMP *0x8000

481 名前:デフォルトの名無しさん mailto:sage [2006/09/22(金) 03:38:12 ]
環境や前提条件をまず示してくれ。話はそれから。
おそらくブート時のロード処理だと見当はつくが。
或いは逆アセしてみて意図したコード(0x8000への絶対ジャンプ)に
きちんと変換されたかを確認するとか。

482 名前:デフォルトの名無しさん mailto:sage [2006/09/22(金) 07:27:25 ]
*0x8000だと、0x8000番地にある16ビットの値をアドレスとして処理する。
0x8000番地に飛ばすならjmp $0x8000が正解だと思う‥‥

483 名前:482 mailto:sage [2006/09/22(金) 07:52:23 ]
>>480のコードをちょっと修正。文法からGASを使っていると仮定。
バッファのアドレスを指定するときはBXレジスタも設定しないと駄目かと。
セグメント指定しているなら、セグメント間ジャンプで飛ばした方が確実。

MOVW $0x800, %AX
MOVW %AX, %ES
MOVW $0, %BX ; ES:BX = 0x800:0x0

MOVB $0x00, %CH
MOVB $0x02, %CL
MOVB $0x00, %DH
MOVB $0x00, %DL

MOVB $0x02, %AH
MOVB $0x01, %AL
INT $0x13

LJMP $0x800,$0

484 名前:デフォルトの名無しさん mailto:sage [2006/09/22(金) 12:32:15 ]
>>481-483
サンクス。

>>481
すいません。
OS:FreeBSD6.1
アセンブラ:GCC
その他:ld、objcopy
エミュレータ:bochs
作っている物:ブートの最初の512byteのプログラム

>>482
jmp $0x8000だとコンパイルエラーになります。


www.gnu.org/software/binutils/manual/gas-2.9.1/html_chapter/as_16.html

Absolute (as opposed to PC relative) call and jump operands must be prefixed with `*'.
If no `*' is specified, as always chooses PC relative addressing for jump/call labels.
を見て絶対アドレスでJMPする場合「*」が必要なのかなと思いました。

485 名前:デフォルトの名無しさん mailto:sage [2006/09/22(金) 13:08:06 ]
>>482
「*」を付けた際の動作は、御指摘の通りでした。
解決できました。
ありがとうございました。

486 名前:463 ◆RMO61H2xHE mailto:sage [2006/09/22(金) 20:27:49 ]
>>479
ご教示、ありがとうございます。とても助かりました。

今度は、こんな問題で引っかかっています。
eHllo, World としたいのですけど Helelo, Worldとなってしまいます!

section .data; データセクションの定義
messagedb'Hello, World', 0Ah
lengthequ$ -message; 文字の長さ

section .text
global _start
_start:
movedx, length; 文字列の長
movecx, [message] ; 以下の3行でmsgとmsg+1の内容を入れ換える
xchgecx, [message+1];
mov[message], ecx;
movecx, message; 出力する文字の指定
movebx, 1; ファイルハンドル(1=標準出力)
moveax, 4; 出力(sys_wrigte)
int0x80; システムコール,出力する

moveax, 1; sys_exit
movebx, 0; 終了ステータスコード
int0x80; システムコール,終了する

487 名前:デフォルトの名無しさん [2006/09/22(金) 21:03:09 ]
GNU asについて質問です。
lss 20+4(%esp), %esp
と、ESPとSSに1命令で値をつめてるコードがあったのですが、
この20+4()ってのはどういう意味なんでしょうか?

488 名前:デフォルトの名無しさん [2006/09/22(金) 21:11:12 ]
MMX の質問です

pand mm0, mm1

を実行し結果がゼロになっても、ゼロフラグが立たないようです。
ゼロかどうかをチェックするにはどうしたらいいんでしょうか?

489 名前:463 ◆RMO61H2xHE mailto:sage [2006/09/22(金) 21:13:04 ]
スペースが無視されたみたいなので、もう一回送ります。

section .data ; データセクションの定義
message db ' Hello, World ', 0Ah
length equ $ -message ; 文字の長さ

section .text
global _start
_start:
mov edx, length ; 文字列の長
mov ecx, [message] ; 以下の3行でmsgとmsg+1の内容を入れ換える
xchg ecx, [message+1] ;
mov [message], ecx ;
mov ecx, message ; 出力する文字の指定
mov ebx, 1 ; ファイルハンドル(1=標準出力)
mov eax, 4 ; 出力(sys_wrigte)
int 0x80 ; システムコール,出力する

mov eax, 1 ; sys_exit
mov ebx, 0 ; 終了ステータスコード
int 0x80 ; システムコール,終了する

eHllo, World としたいのですけど Helelo, World と表示されます!



490 名前:487 mailto:sage [2006/09/22(金) 22:01:16 ]
コンパイルされたものをobjdumpでのぞいたら、
lss 0x18(%esp),%esp
こういう風に変換されてました。
よく調べもせずに質問してすみませんでした。

491 名前:デフォルトの名無しさん mailto:sage [2006/09/22(金) 22:12:08 ]
>>489
mov cl, [message+2]
xchg cl, [message+3]
mov [message+2], cl

492 名前:デフォルトの名無しさん mailto:sage [2006/09/22(金) 22:56:07 ]
なんか

春だな・・・

493 名前:463 ◆RMO61H2xHE mailto:sage [2006/09/22(金) 22:56:18 ]
>>491
ありがとうございます。
eHllo, Worldとなりました。アセンブリって意外とレジスタの動きが分かりやすいん
ですね。
本や、ネットで検索しながらやってるんですけど、Linuxのnasmで
初心者に分かりやすい解説は、殆んどないんで困ってました。

494 名前:デフォルトの名無しさん mailto:sage [2006/09/22(金) 23:18:49 ]
どっかにnasm本家のマニュアルの日本語訳があったはずだが。
あれで十分よ

495 名前:デフォルトの名無しさん mailto:sage [2006/09/22(金) 23:19:53 ]
ってかmasmはMS公認で無料になったか。
イイジダイダナー

496 名前:・∀・)っ-○◎●新世紀ダンゴリオン ◆DanGorION6 mailto:sage [2006/09/23(土) 05:38:45 ]
>>488
MMX演算はフラグレジスタを更新しない。
いちど汎用レジスタに転送してから比較する必要がある。

0かどうかだけを判定するだけなら、たとえば

packssdw mm0, mm0
movd eax mm0
test eax, eax

497 名前:デフォルトの名無しさん mailto:sage [2006/09/23(土) 18:56:59 ]
Z80ですけど
DAAってハーフキャリーは0になるの?それとも変化するの?どっち?

498 名前:デフォルトの名無しさん mailto:sage [2006/09/23(土) 20:05:47 ]
変化する

499 名前:デフォルトの名無しさん mailto:sage [2006/09/26(火) 21:57:47 ]
Hello, Worldを10回表示して改行したいんですけど、
下記のソースを弄ってみましたが、よく分からないので教えて頂けないでしょうか。

section .data
msg db 'Hello, World', 0ah
len equ $ -msg

section .text
global _start

_start:
mov eax, 4 ; 出力
mov ebx, 1 ;(1=標準出力)
mov ecx, msg ;
mov edx, len ; 文字列出力

int 0x80 ; 出力
doit:
dec ecx ; ecxをデクリメントする
jecxz endquit ; ecxがゼロならジャンプ
jmp doit ; doitへジャンプ

endquit:
mov eax, 1 ;(sys_exit)
mov ebx, 0 ; 終了ステータスコード
int 0x80 ; 終了



500 名前:デフォルトの名無しさん mailto:sage [2006/09/26(火) 22:49:24 ]
>>499
それじゃ一回だけ表示された後、しらばく後かすぐに終了するだろ。

int 0x80 ; 出力
doit:
dec ecx ; ecxをデクリメントする
jecxz endquit ; ecxがゼロならジャンプ
jmp doit ; doitへジャンプ

このdoit以下何もやっていないと同じだぜ?
なぜecxをデクリメントして0になったら終了になるん?何目的だ?

たぶんint0x80は文字列表示機能だと仮定するなら、
ediにでも0xaを入れておいて、
dec edi
jnz _start ← ゼロじゃなけりゃジャンプっての
にすればええ。


501 名前:499 mailto:sage [2006/09/26(火) 23:28:28 ]
>>500
> それじゃ一回だけ表示された後、しらばく後かすぐに終了するだろ。

その通りなんです。弄っているうちに わけわからなくなってしまい、
1回だけ表示するプログラムに戻したものを書き込みました。
>499 の投稿は下記のDOSのプログラムをLinux上で jecxz を使って同じような動作を
再現できないか試行錯誤の最中だったんです。

; DOS プログラム
bits 16
org 0x100

mov ah, 9 ; 文字列出力指定
mov dx, msg ;出力する文字列
mov cx, 10 ; cxレジスタの値を10にする

doit: int 21h
dec cx ; cxを1だけ減らす
jcxz endquit ; cxがゼロならendquitへ
jmp doit ; doitへジャンプ

endquit:
mov ah, 4ch
mov al,0
int 21h
msg db "Hello, World", 0dh, 0ah,"$"

502 名前:デフォルトの名無しさん mailto:sage [2006/09/26(火) 23:44:57 ]
システムコール呼ぶときecxレジスタ使ってるだろ?
そんくらい気ずかん?(´・ω・`)

503 名前:デフォルトの名無しさん mailto:sage [2006/09/27(水) 01:45:08 ]
>>501
答えは分かるがあえて書かない。自分で考える事が上達には大事だしな。

先ほど書いたようにdiあるいはsiをcxの代わりにカウンタとし、

dec di
jnz また文字列出力する場所

ってな感じにするのが良い。
あとint21hの後のレジスタの値は保障できないと考えた方が一応はいいと思うから、
doitの位置を変えた方が確実だと思う。


504 名前:デフォルトの名無しさん [2006/09/27(水) 09:36:16 ]
x86CPUで、32ビットの値を3倍するとき、
x = x * 3;
と、
x = (x<<1) + x;
はどちらが高速なんですか?

505 名前:デフォルトの名無しさん mailto:sage [2006/09/27(水) 10:02:43 ]
>>504
スループットは上の方がいいが、
レイテンシは下の方がいい。
CPUによるけど。
どちらが速いかは周りの処理にもよる。

でも、x86ならこれが一番速いよ。
lea x,[x*2+x]

506 名前:デフォルトの名無しさん mailto:sage [2006/09/27(水) 15:00:54 ]
ていうか、いまどきのコンパイラは
3倍するのはleaに最適化してくれますよ。

507 名前:・∀・)っ-○◎●新世紀ダンゴリオン ◆DanGorION6 mailto:sage [2006/09/27(水) 22:23:36 ]
Pen4だとこれでも速かったりwww
mov edx, eax
add eax, eax
add eax, edx


508 名前:デフォルトの名無しさん mailto:sage [2006/09/28(木) 00:52:21 ]
>>507
シフトが add の 8 倍遅い変態 CPU を持ち出すのは反則だと思いまつ。

509 名前:デフォルトの名無しさん mailto:sage [2006/09/28(木) 01:18:15 ]
ペン4のALUは糞すぎるなw



510 名前:・∀・)っ-○◎●新世紀ダンゴリオン ◆DanGorION6 mailto:sage [2006/09/28(木) 01:23:14 ]
依存関係を高いクロックによって解決するという手法は全てが間違いだった訳じゃないけど
クロックを重視したデータキャッシュが小さすぎたりパイプラインが長すぎたり
熱すぎたりで、全体としてマイナス要素が大きかったのが敗因ですな。


511 名前:デフォルトの名無しさん [2006/09/30(土) 18:11:57 ]
スタックを使って A B と表示させようと思うのですけど、ウマクいきません!?
ご教示 お願いできないでしょうか。

section .text
global _start
_start:
movdl, 0x41 ; "A"
push dx
call putchar
pop dx
mov dl, 0x42 ; "B"
push dx
call putchar
pop dx
mov eax, 1 ; sys_exit
mov ebx, 0 ; 終了ステータスコード
int 0x80 ; システムコール,終了する

putchar: ; スタックの文字を出力する サブルーチン
push esp
mov ebp, esp
sub esp, 0x40 ; ローカルスタックスベース
mov ebx, [ebp+4] ; 最初のパラメータ
mov dl, bl
mov eax, 4 ; sys_write
mov ebx, 1 ; ファイルハンドル(1=標準出力)
mov ecx, esp ; 書き込むバッファ
mov edx, 2 ; 文字出力することを指定
int 0x80 ; システムコール,出力する
mov esp, ebp ; sub esp,0x40を取り消す
pop esp
ret






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<188KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef