X



アセンブラ 13
■ このスレッドは過去ログ倉庫に格納されています
0354デフォルトの名無しさん
垢版 |
2017/10/15(日) 13:58:03.79ID:DMOHal5+
ちょっとお尋ねします
手続きカウンタの値により手続き順に処理を飛ばすプログラムを考えています
この時手続きカウンタの評価が先頭につきますが
このオーバーヘッドがいやなのでProgramCounterに次の処理の飛び先をロードしてjumpさせたいのですが

if 手続きカウンタ==1 jump 処理1:  
if 手続きカウンタ==2 jump 処理2:
      :
if 手続きカウンタ==n jump 処理n:  手続きnが多いとオーバーヘッドが無視できなくなる
  else 出口:

処理1: {  
   :
  jump_出口:
手続きカウンタ +=1 }             // ここをPCに代入するための飛び先番地に変更


処理n: { 
   :
手続きカウンタ=1(手続きカウンタ初期化) // ここをPCに代入するための処理1の飛び先番地に変更
jump_出口: }

出口:

通常のCPUのJUMP命令は直値のみでレジスタ間接は無いので変化球技で実現する必要があります
こんな変なことをやって居る方はおられますか? 又、どのように実現したのでしょうか? 
0355デフォルトの名無しさん
垢版 |
2017/10/15(日) 14:23:06.17ID:UA81qQu7
x86とかならjump [mem] やjump reg があるよ
場合によっては、スタックに戻り先とジャンプ先を積んでretしてもいい
0356デフォルトの名無しさん
垢版 |
2017/10/15(日) 14:58:16.97ID:DMOHal5+
pushしてretで問題なさそうなのかな?
0359デフォルトの名無しさん
垢版 |
2017/10/15(日) 16:10:57.55ID:DMOHal5+
わいの今使ってるCPUのニーモニックを目を皿のようにして探しているんだが
レジスタ間接ジャンプがないんやでえええ
見方が悪いのかもな 普通そんなことありえないか・・・そうだよな?
テーブルジャンプなんて普通に使うもんな
0361デフォルトの名無しさん
垢版 |
2017/10/16(月) 00:11:29.28ID:7Byc8Q4r
Cコンパイラがあるならswitchでコード書いてアセンブラソース吐かせろ
多分テーブルジャンプになるんじゃないかな
0363デフォルトの名無しさん
垢版 |
2017/10/16(月) 00:53:45.76ID:+2vhlmuF
本当にジャンプ位置をダイナミックに決められないのなら、
2分検索とかでいいし、率がわかっているならもうちょっと頭の良い方法でも良い
1個ずつ分岐するのは大抵の場合効率が悪い
0368デフォルトの名無しさん
垢版 |
2017/10/21(土) 12:37:28.95ID:Hb3Ud/Wn
avrってメモリ保護とかあるの?
なければ
・jmp命令とオペランド(飛び先)をテーブルにする
・機能番号でテーブルからjmp命令を拾ってくる
・次のjmp命令を書き換える
だけじゃねぇか
そこだけram上でやればいい
0375デフォルトの名無しさん
垢版 |
2017/10/23(月) 17:31:11.48ID:lCIoxZis
罪linkx
0376355
垢版 |
2017/10/23(月) 17:36:41.36ID:zdzyG1CL
なんで俺が死刑なんだよ
変なことは書いてないだろ
0380デフォルトの名無しさん
垢版 |
2017/10/29(日) 16:53:13.43ID:crR+gSB3
 ┌○┐
 │死|ハ,,ハ
 │  |゚ω゚ )  
 │刑| //
 └○┘ (⌒)
    し⌒
0381デフォルトの名無しさん
垢版 |
2017/11/07(火) 14:26:10.97ID:r6tXNL/D
 ┌○┐
 │ハ|ハ,,ハ
 │  |゚ω゚ )  
 │ゲ| //
 └○┘ (⌒)
    し⌒
0387デフォルトの名無しさん
垢版 |
2018/02/28(水) 17:54:56.02ID:F8/eMdWm
6800の本買ってしまった
0389デフォルトの名無しさん
垢版 |
2018/04/11(水) 12:27:17.38ID:bG1z7LTF
Z80の本が出たときは我慢出来たけど
6800の本が出たときは逝ってしまった
0390デフォルトの名無しさん
垢版 |
2018/04/14(土) 19:53:08.11ID:xcHHAJfd
zeas88
一月かけて入力して動かなかった
三月かけてダンプをチェックしても動かなかった

思い出した
0392デフォルトの名無しさん
垢版 |
2018/05/23(水) 19:48:01.34ID:Au5e7VGg
僕の知り合いの知り合いができたパソコン一台でお金持ちになれるやり方
役に立つかもしれません
グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』

VM3VN
0394デフォルトの名無しさん
垢版 |
2018/07/05(木) 01:47:01.59ID:RfoszcD2
RS0
0396デフォルトの名無しさん
垢版 |
2018/09/05(水) 04:25:32.38ID:qK+vip/P
Intel記法とAT&T記法ってどっちがいいと思う?
思う? とか訊いておいて 実は俺のなかではAT&T記法のほうがいいと思ってるw
例えば
add eax,4
addl $4,%eax
という命令があってAT&T記法のほうはUnixで用いられているコマンド
(というかOS/2系列でも同じようなコマンドがあるが)
$ copy aaa.txt bbb.txt
の文法に並びがそっくりだし,変数に$を前置するというのもUnixで最もよく用いられているB系シェルの
変数を表わす規則と同じ。レジスタに%が付いてるのも分かりやすいと思う。

今主流なのはIntel記法なので 残念ながら俺は少数派なんだろうがw
0397デフォルトの名無しさん
垢版 |
2018/09/05(水) 11:09:53.34ID:/V9AsOwQ
add eax,4
0399デフォルトの名無しさん
垢版 |
2018/09/05(水) 11:52:27.66ID:vQx16S6k
>>395
チェックサムは、

・・・ A B ・・・SUM1
・・・ B A ・・・SUM2

見たいな間違いがあると、縦横チェックサムであっても、
間違いに気づく事が出来なかったなぁぁ・・・。
0400デフォルトの名無しさん
垢版 |
2018/09/05(水) 17:15:48.86ID:vQx16S6k
雑誌に書いてあったバイナリコード :
・・・ A B ・・・SUM1
・・・ B A ・・・SUM2

間違って入力したコード
・・・ B A ・・・SUM1
・・・ A B ・・・SUM2

これだと、横・縦の両方のチェックサムが雑誌と同じになってしまう。
0401デフォルトの名無しさん
垢版 |
2018/09/24(月) 17:55:23.64ID:7SQMHJ5j
>>396
gccでIntel記法でアセンブラ出力できるよ
gcc -S -masm=intel hogehoge.c
インラインアセンブラでIntel記法使う場合も
gcc -masm=intel hogehoge.c

objdumpでIntel記法で逆アセンブルする場合は
objdump -M intel -d hogehoge.obj
0403デフォルトの名無しさん
垢版 |
2018/09/27(木) 01:21:30.14ID:GWQb325r
396ですが,AT&T記法を中心に学ぶことにしました。
理由は,2つあり,
・OSの勉強をするためにこれから読んでいこう(というか既に読んでいる)
UNIX v6 for x86のアセンブラがAT&T記法である
・仕事でアセンブラを使う訳ではないので,今現在普及しているものでなくてよい
つまりIntelが発表するCPUの最新機能を使ったりする機会がないので
枯れた情報しかないAT&T記法でも十分やっていけると考えた
ということです。
まあ,チラ裏ですが,これから個人でアセンブラを学ぶとしてる人が見てれば参考にして下さい。
0404デフォルトの名無しさん
垢版 |
2018/09/27(木) 03:14:00.28ID:3iNJ0doV
Intel・AT&T 記法を抽象化した、仮想アセンブラのLLVM で学べ!

情報処理資格でも、仮想アセンブラのCASL 2
0405デフォルトの名無しさん
垢版 |
2018/09/27(木) 05:41:06.10ID:fZkL81UT
gdbの逆アセンブラも
set disassembly-flavor intel
と打ち込めばIntel記法で逆アセンブルしてくれる
デフォルトでIntel記法にしたいならホームディレクトリの.gdbinitに上記を記述
詳しくはググると出てくるかも
0406デフォルトの名無しさん
垢版 |
2018/09/27(木) 06:24:39.43ID:fZkL81UT
ARMは
mov r0, #4
64bitのARMは
mov x0, #4
と右から左

MIPSも
li $4, 4
RISC-Vも
li a0, 4
と右から左

PowerPCも
li %r3, 4
と右から左

今のパソコンやサーバでメジャーなCPUの多くが右から左
0407デフォルトの名無しさん
垢版 |
2018/09/27(木) 08:56:29.52ID:GWQb325r
しかしどうして右から左に読むのでしょうね。
英語だと特に
move number to address
と自然に読み下せるのに。(というかニーモックってまさにその目的の筈では……)
0409デフォルトの名無しさん
垢版 |
2018/09/27(木) 10:12:23.20ID:+X2PETpr
左右なんてどっちでもいい
記法もどっちでもいい

もっと本質的なことに頭使え
0410デフォルトの名無しさん
垢版 |
2018/09/27(木) 10:27:51.73ID:lockuNq+
アセンブラの本質って機械語不便だからわかりやすくする記法なのに
それに気を使わずにどこに頭使うの?
0411デフォルトの名無しさん
垢版 |
2018/09/27(木) 11:04:46.72ID:JRG0evD8
>>407
ある種の文化の衝突が起きていると思う。

事実標準に近かったZ80などでは、語順的には、今「Intel記法」と
呼ばれているものだった。でもIntel記法よりも洗練されている
感じだった。それが、人気があったひとつの理由だと思ってる。

でも、学者などは、さかさまに固執するような印象が多い気がする。
なんでも市場や事実標準とは逆を好む天邪鬼みたいな姿勢の人が多い。

たとえば、NEC機が流行っていたころは、京大構内では日立マシンが標準だった。
今、Windowsマシンが標準なのに、灯台ではMacが標準。
0412デフォルトの名無しさん
垢版 |
2018/09/27(木) 11:13:26.21ID:JRG0evD8
>>411
学者は、事実標準に逆らったことをするのが大好き。なぜなら、そうすれば、
自分たちが優位になると思っているから。

たとえば、数式処理プログラムのMaximaも、LISPで書かれているし、
AI関連のライブラリが充実している言われる、Pythonも然り。

東大がMacを標準にしたのは、表向きはMSの独占的地位を破壊するため
かも知れないが、裏には、プログラミングが得意な学生に学者が負ける
と面目を保てなくなるのが困るからではないかと考えられている。
0415デフォルトの名無しさん
垢版 |
2018/09/27(木) 19:08:47.41ID:fZkL81UT
UNIX v6やv7が使われた16bitミニコンのPDP-11やBSDが使われたVAX11が左から右の記法だった
PDP-11からの影響を受けた680x0も左から右

だから1970年代、1980年代前半から半ばまでのUNIX界隈では左から右が主流だった
だからx86のAT&T記法が左から右なんだろうな
1980年代終り頃に普及したMIPS、POWERが右から左の記法
(よく知らないがSPARCやPA-RISCは左から右のようだ)
要するに左から右の記法はPDP-11の影響を受けてるわけだ
(VAX11はPDP-11の後継の32bitミニコン)
SPARC、PA-RISCが左から右なのは
680x0を使ったワークステーションの後継機種用のCPUとして作られたからだろうな
今でも680x0の影響を受けてるCPUは左から右

逆に言えば、パソコンやサーバ、スマホなどは
PDP-11、VAX11、680x0などのCPUの影響を受けてないCPUが主流
0416デフォルトの名無しさん
垢版 |
2018/09/27(木) 20:12:35.94ID:GWQb325r
そういう経緯とか全然知らんかったわ。
Z80は古い機種だと思うんだけど,>>411によればIntel記法に近いらしい。
一概に,「昔はAT&T記法が主流だった」とも言えねえのな。
0417デフォルトの名無しさん
垢版 |
2018/09/27(木) 21:20:43.26ID:v+2P+rz3
>>416
Intel 8080 の改良版が、Z80。
以下、同じ命令を、8080とZ80について書いてみる。
Z80の方が現代のアセンブリ言語に近く、人間には覚え易くて
理解しやすいが、アセンブラの作成が当時としては難しくなった。
Z80がなぜ人気が爆発したか、これだけ見ても分かるかと思う。

【8080】
MVI A,byte  ; A <-- byte  // move immediate を略して MVI
MOV A,B   ; A <-- B   // 意味は同じなのに、第二オペランド
               // がレジスタに変わったなっただけで命令表記が変わる。
MOV A,M   ; A <--(HL)  // M の意味は、(HL)
MOV H,A   ; H <-- A
MOV L,A   ; L <-- A
LXI H,word  ; HL <-- word  // これも意味は move なのに命令が変わる。
LHLD word   ; HL <---(word) // これも、現代なら単に(word)と書けばいいとこ
                // ろが命令自体を変えなければならなかった。

【Z80】
LD A,byte
LD A,B
LD A,(HL)
LD H,A
LD L,A
LD HL,word
LD HL,(word)

【参考】
http://nemesis.lonestar.org/computers/tandy/software/apps/m4/qd/opcodes.html
0418デフォルトの名無しさん
垢版 |
2018/09/27(木) 21:37:48.64ID:v+2P+rz3
>>415
命令表記を左右逆にしていれば、今頃 68000 が天下を取っていたかもしれない。

高級言語の「A = B」がそのまま、MOV A,B と書けるのはやはり分かりやすいので。
0419デフォルトの名無しさん
垢版 |
2018/09/27(木) 21:50:06.74ID:v+2P+rz3
>>417
昔も今もそうかもしれないが、IntelもMSも、余り「判りやすく書く」
「すっきりと設計する」ということが余り得意ではないかもしれない。

MSの作ったAPIは構造が汚い。
0420デフォルトの名無しさん
垢版 |
2018/09/27(木) 21:55:12.76ID:v+2P+rz3
Zilogがせっかく、二モニックを美しく修正したのに、Intelは、また、MMX や SSE以後で
汚くしてしまった。

それに、セグメントの概念もMMUの設計もひどかった。
セグメントに関しては、トランジスタの集積度が少なすぎてしょうがなかったのかも
しれないが、それを長く引きずりすぎた。

80386のプロテクトモードなんかどうでも良くて、単にプロテクトの無い32BITの
フラットモードがあれば喜ばれ、MS-DOSが今でも続いていたかもしれない。
0421デフォルトの名無しさん
垢版 |
2018/09/27(木) 22:00:30.07ID:GWQb325r
>>418
しつこくてすまんが
$ cp file.org file.new
$ mv file.org file.new
↑こういう操作を考えると
AT&T記法のほうが馴染みやすくない?
0423デフォルトの名無しさん
垢版 |
2018/09/28(金) 15:38:54.43ID:O5kQkBkV
CP/M copy も右から左だったぜ
0424デフォルトの名無しさん
垢版 |
2018/09/28(金) 15:43:05.12ID:hWUH9Sli
>>423
http://afsoft.jp/os/p02.html
CP/M も copy コマンドは、「左から右」だったと思うけど:

COPYコマンド
ディスクをコピーします。
【書式】COPY {mode} {コピー元} {コピー先}
 mode : ALL・・・ディスク全部をコピー
     BOOT ・・ブートトラックをコピー
     FILES・・ブートトラック以外をコピー
 
0425デフォルトの名無しさん
垢版 |
2018/09/28(金) 15:50:53.05ID:O5kQkBkV
お前つかったことないやろ
0427デフォルトの名無しさん
垢版 |
2018/09/28(金) 16:09:07.08ID:hWUH9Sli
コピーではないが、rename コマンドにそれらしき痕跡はあった。
確かに、右から左で、しかも、「=」記号もつけていたらしいね:


http://www.discordia.org.uk/px4/cpm.html

REN [d:]newname.ext = oldname.ext
Change the name of a disk file from oldname.ext to newname.ext
0428デフォルトの名無しさん
垢版 |
2018/09/28(金) 16:11:14.79ID:hWUH9Sli
これかな???


PIP [d:][newfile.ext]=[d:][filespec][<t>
Copy files between peripherals whilst performing optional conversion <t>.

Copy file from drive to drive: C> PIP H:=A:INFO.DAT
Copy file to new name: C> PIP A:NEW.DAT=A:INFO.DAT
Copy file to printer: C> PIP LST:=A:LETTER.TXT
0429デフォルトの名無しさん
垢版 |
2018/09/28(金) 16:13:46.37ID:hWUH9Sli
確かに有った。copy コマンドが登場するより前に、PIP コマンドがあったのか。
知らなかった。

https://en.wikipedia.org/wiki/Peripheral_Interchange_Program

The original PIP syntax was

PIP destination←source /switches
using the left-arrow character from the ASCII-1963 character set
that the Flexowriter keyboards of the time used.
As other terminals were introduced that used later versions
of ASCII (without the left-arrow character), PIP allowed the syntax

PIP destination=source
0433デフォルトの名無しさん
垢版 |
2018/09/28(金) 20:45:43.66ID:TLhVFQk5
でもcopyコマンド(in CP/M)自体はUnix風の動作なんだよね。
pipコマンドというとPythonのアレしか思い浮かばないがw
0434デフォルトの名無しさん
垢版 |
2018/09/28(金) 23:16:34.75ID:0Eaaaj8i
PIPエレキバン
0435デフォルトの名無しさん
垢版 |
2018/09/29(土) 07:03:12.39ID:NSCd5Wk/
pipはビルトインじゃなくて外部コマンドだったから数バイトのコピーするときにでも
pipを読み込むために数十KBの実行ファイルをフロッピーゴトゴト言わせてからコピーが始まる
0436デフォルトの名無しさん
垢版 |
2018/09/29(土) 09:44:28.70ID:PPHj/b7C
>>435
マジかよww
なんでそんな不便な方法しかなかったんだろう
当時はそれが一番効率的と考えられてたんかな
0441デフォルトの名無しさん
垢版 |
2018/10/01(月) 19:31:45.23ID:gNvpqBnl
MS-DOSのVer2.xxからはいろんな意味でUNIXをリスペクトしてるからな
UNIX流にファイルハンドルでファイルを扱ったり、階層ディレクトリを導入したり、
環境変数を導入したりな
マイクロソフト自身がXENIXというUNIXを販売してたしね
0452デフォルトの名無しさん
垢版 |
2018/10/14(日) 16:01:42.97ID:13p+7YwI
>>451
MMX, SSE〜SSE4, AVX, AVX2, AVX512 は、SIMD命令だから、ループを展開して、
ベクトル計算のように考え直した場合、そのベクトルの足し算やベクトルの
要素ごとの掛け算などが速くできるようになる。
■ このスレッドは過去ログ倉庫に格納されています

ニューススポーツなんでも実況