1

次のように定義された x、y、および z が値 1 を取得するための最短可能なコード (命令の数をカウント) をリストします。80*86 マシンの場合

x:   dw   0xff00
y:   resb 1
z:   resw 1

編集: 答えはそのようなものであるべきだと思います:

MOV  DWORD [x+1], 0x01010001  ; 

;小切手:

mov eax , 0
mov al , byte[y]
print_d eax ; print 0

mov eax , 0
mov ax , word[x]
print_d eax ; print 256

mov eax , 0
mov ax , word[z]
print_d eax ; print 257 

しかし。それは良くない...should print 1

4

1 に答える 1

1

xyおよびがバイトとしてリストされているメモリは次のとおりです(z下位アドレス(x)から上位(z)まで):

xx XX yy zz ZZ

ここxxで、はx(0)の最下位バイト、は(0xFF)XXの最上位バイトであり、およびについても同様です。xyz

私がそれを正しく理解していて、初期化されていない場合(yメモリ予約キーワードのNASM構文を示唆しています)。zres*

したがって、これを変換する必要があります。

00 FF yy zz ZZ

これに:

01 00 01 01 00

右?

MOV DWORD [x+1], 0x01010001それを次のように変換します:

00 01 00 01 01

だから、それは正しくありません。また、32ビット命令は一度に最大4バイトを書き込むため、5バイトを変更するには複数の命令が必要です。

命令数の最短は2 MOVs(NASM構文)だと思います。

mov dword [x], 0x01010001
mov byte [x+4], 0
于 2012-06-25T10:00:53.693 に答える