1

私は自分自身で組み立てを学ぼうとしています (好奇心と学習への関心から) 5 から 0 まで数えるコードを開発しました。それだけです。次のコードが効率的かどうか疑問に思っていましたか?

.386
.model flat, stdcall

.data
i dd 5

.code
main:
    MOV cx, 5
    lp:
    LOOP lp
    MOVZX eax, cx  
RET 
END main

の値をMOVZXコピーする命令を使用していることに注意してください(コンパイラが返すために使用するもの)。単に使用するとプログラムがアセンブルしないため、これを行います。使用は望ましいですか?または、これを行うべきより効率的な方法はありますか?cxeaxMOVMOVZX

私のコードでもi dd 5、当初の計画ではアセンブルする予定だったMOV cx, iのに、アセンブルしようとするとコンパイラがアセンブルを拒否していることに気付くでしょう。(MOVSX同じ結果が得られます)。i2 番目の質問は、値をcxレジスタに移動するにはどうすればよいですか?

4

3 に答える 3

1

32 ビット ターゲット用に記述している場合ecxは、16 ビットcxレジスタの代わりにレジスタを使用します。そうすればmov eax, ecx、アセンブラがオペランドのサイズについて不平を言うことなく使用できるようになります。また、loop命令は暗黙的に を使用するecxため、下位 16 ビットだけでなく、レジスタ全体が 5 で初期化されていることを確認する必要があります。

を使用した後ecx、命令mov ecx, iは機能する可能性があります-しかし、それを試したときに実際にどのようなエラーが発生したかは言いませんでした。

于 2012-10-02T20:26:37.887 に答える
1

あなたのコードはあまり効率的ではありません。LOOP 命令は古いものであり、単純に手動でデクリメントするだけでは機能しない傾向があるため、ほとんど使用されなくなりました。

レジスタ自体と XOR することでレジスタをゼロにすることができ、すぐに ADD を使用して数値をレジスタにロードできます。私はアセンブリをあまり使用しないため、構文がしっかりとダウンしておらず、残念ながら例を投稿できません。

于 2012-10-02T20:27:48.540 に答える
1

あなたに似たCの例を次に示します。

#include <stdio.h>

int i = 5;

int
main (int argc, char *argv[])
{
  while (--i >= 0)
    ;
  return 0;
}

Visual Studio アセンブラーの出力 (cl /Fa) は次のとおりです。

    .386P
include listing.inc
if @Version gt 510
.model FLAT
else
_TEXT   SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT   ENDS
_DATA   SEGMENT DWORD USE32 PUBLIC 'DATA'
_DATA   ENDS
CONST   SEGMENT DWORD USE32 PUBLIC 'CONST'
CONST   ENDS
_BSS    SEGMENT DWORD USE32 PUBLIC 'BSS'
_BSS    ENDS
_TLS    SEGMENT DWORD USE32 PUBLIC 'TLS'
_TLS    ENDS
FLAT    GROUP _DATA, CONST, _BSS
    ASSUME  CS: FLAT, DS: FLAT, SS: FLAT
endif
PUBLIC  _i
_DATA   SEGMENT
_i  DD  05H
_DATA   ENDS
PUBLIC  _main
_TEXT   SEGMENT
_main   PROC NEAR
; File x.c
; Line 7
    push    ebp
    mov ebp, esp
$L342:
; Line 8
    mov eax, DWORD PTR _i
    sub eax, 1
    mov DWORD PTR _i, eax
    cmp DWORD PTR _i, 0
    jl  SHORT $L343
; Line 9
    jmp SHORT $L342
$L343:
; Line 10
    xor eax, eax
; Line 11
    pop ebp
    ret 0
_main   ENDP
_TEXT   ENDS
END
于 2012-10-02T20:30:44.573 に答える