こんにちはすべて いずれも、plzはどのように8086アセンブリ言語で2D配列を処理するために教えてもらえます。 私はアセンブリ言語プログラミングの初めです。多次元配列
多次元配列
答えて
Madhurのリンクはかなりそれをカバーしてい おかげで、あなたはそれを読みましたか?
すでに、例えばCプログラミングレベルで2Dアレイを理解するならば、アセンブラは次の論理的なステップです。
たとえば、配列z [1] [2]は、そのように考えてみたい場合は2番目の行の3番目の項目です。そのアドレスはz +のCアドレスにあるように計算します配列の最初のインデックス時間幅は、それが13バイト幅であり、2番目のインデックスに加えて& z +(13 * 1)+2 = &z + 15;
擬似コードではなくx86のコードを(場合、これは宿題である)の使用。
;brute force ldr r0,=z ;load address of z into r0 mov r1,#13 mul r1,#1 ;make this a register or load from a memory location mov r2,#2 ;make this a register or load from a memory location add r0,r1 add r0,r2 ldrb r1,[r0] ;read the byte strb r3,[r0] ;write the byte ;if your instruction set allows register offset ldr r0,=z ;load address of z into r0 mov r1,#13 mul r1,#1 mov r2,#2 add r1,r2 ldrb r4,[r0,r1] ;read the byte strb r3,[r0,r1] ;write the byte ;or immediate offset and offset is hardcoded ldr r0,=z ;load address of z into r0 mov r1,#13 mul r1,#1 add r0,r1 ldrb r4,[r1,#2] ;read the byte strb r3,[r1,#2] ;write the byte
あなたがC
unsigned char x[4][16]; unsigned char z[4][16]; unsigned int ra,rb; for(ra=0;ra<4;ra++) { for(rb=0;rb<16;rb++) { x[ra][rb]=z[ra][rb]; } }
でループを持っていた場合、アセンブラへの変換はかなり単純です。
ldr r0,=x ldr r1,=z mov r2,#0 ;ra outer: mov r3,#0 ;rb inner: mov r4,r2 lsl #2 ;16 bytes wide add r4,r3 ldrb r5,[r1,r4] strb r5,[r0,r4] add r3,r3,#1 cmp r3,#16 bne inner add r2,r2,#1 cmp r2,#4 bne outer
ブルート力は、常に、各プラットフォームのために動作するブルートフォースは、ベースアドレス+(幅×最初のインデックス)+(要素の第2の指標倍のサイズ)です。最適化はあなたがやろうとしていることに大きく依存しています。例えば、最初のアセンブリの例では、最初のインデックスがハードコードされていれば1を掛けるのは愚かで、2ならレジスタを移動するのは愚かです。ハードコードされた数、ちょうど2を加えてください。あなたのプラットフォームが乗算を持たないか、厄介な場合は、ループを1回計算すればループの最適な数が変わります。アイデアは、乗算を取り除く、または他のトリックを削除する場合乗算する場合は、幅を変更することはできませんし、あなたのプラットフォームがないか、苦痛を倍増させる。
たとえば、2つのレジスタの合計であるレジスタオフセットアドレッシング[r0、r1]を持つプラットフォームでは、加算を保存してベースアドレスレジスタを破壊しないようにします。ループ。あなたがポインタ(* ptr ++)のように破棄してポインタスタイルを使用したい場合は、ループをどのように実装するかを変えることができますが、ベースレジスタを使用して値を追加できるプラットフォームもあります。 #16はr0でアドレスを使用した後、r0を16からr0に追加すると、余分な命令を追加する必要はありません。x86はそうだと思いますが、このタスクに使用できる他の機能があります。
これは、ループ変数を保持するためにメモリを使用しなければならない可能性が高いことを意味します。これはおそらく、タスクに十分なレジスタがないためです(x86には多くのメモリベースの命令があるため問題ありません)負荷とストアの変動を利用して最適化します。
;This code grabs data bits from accumulator and outputs it to the carry
Main:
clr C
mov A, #00101010b;
call array;
jmp Main;
array:
subb A, #80H; mov can work here if you did not clr C
cpl A; check for proper array location
mov B, #8; set division factor
DIV AB; bit offset contained in B;
mov R6,B;
subb A, #30H; this bit will allow you to mov around the chosen register
cpl A;
mov R7, A;
mov A, @R7; this is the array position
inc R6;
loop:
rlc A; this takes the array bit to the carry for easy access
djnz R6, loop;
- 1. 多次元ブールインデックス多次元配列へ
- 2. 多次元配列
- 3. 多次元配列
- 4. 多次元配列
- 5. 多次元配列
- 6. 多次元配列
- 7. 多次元配列
- 8. 多次元配列
- 9. 多次元配列
- 10. 多次元配列
- 11. 多次元配列
- 12. 多次元配列
- 13. 多次元配列
- 14. 多次元配列
- 15. 多次元配列
- 16. 多次元配列
- 17. 1次元多次元配列への入れ子多次元配列
- 18. シフトは多次元配列
- 19. ラジオボタン、多次元配列、PHP
- 20. テンソルフローの多次元配列
- 21. フィルター多次元配列
- 22. Pythonの多次元配列
- 23. PHPの多次元配列
- 24. 多次元配列は
- 25. スプリット多次元javascript配列
- 26. ストアダイナミック多次元配列
- 27. PHPグループ多次元配列
- 28. 多次元配列ループエラー
- 29. VBSCRIPTの多次元配列。
- 30. 多次元配列クエリmysql
「曲がった記憶ではなく、自分だけです」 –