Assembly 汇编指令代码

Assembly 汇编指令代码,assembly,x86,Assembly,X86,列出使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 25

列出使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 

但是。这不好…sholud print 1

这是内存,您的
x
y
z
以字节的形式列出(从较低的地址(
x
)到较高的地址(
z
):

其中,
xx
x
(0)的最低有效字节,
xx
x
(0xFF)的最高有效字节,同样,对于
y
z

如果我理解正确,
y
z
没有初始化(
res*
提示内存保留关键字的NASM语法)

因此,您要将其转换为:

00 FF yy zz ZZ
为此:

01 00 01 01 00
对吧?

MOV-DWORD[x+1],0x01010001
将其转换为:

00 01 00 01 01
所以,这是不正确的。您需要超过1条指令才能更改5个字节,因为32位指令一次最多写入4个字节

就指令数量而言,我认为最短的指令是2
mov
(NASM语法):


这是您的
x
y
z
以字节形式列出的内存(从较低的地址(
x
)到较高的地址(
z
):

其中,
xx
x
(0)的最低有效字节,
xx
x
(0xFF)的最高有效字节,同样,对于
y
z

如果我理解正确,
y
z
没有初始化(
res*
提示内存保留关键字的NASM语法)

因此,您要将其转换为:

00 FF yy zz ZZ
为此:

01 00 01 01 00
对吧?

MOV-DWORD[x+1],0x01010001
将其转换为:

00 01 00 01 01
所以,这是不正确的。您需要超过1条指令才能更改5个字节,因为32位指令一次最多写入4个字节

就指令数量而言,我认为最短的指令是2
mov
(NASM语法):


现在还不清楚被问到了什么。那代码必须初始化x,y和z吗?“获取值1”是什么意思?这是做什么用的?如果是x86,什么模式?16位?32位?64位?如果是16位,可以使用32位指令吗?我编辑它。“获取值1”表示在指令x=y=z=1之后,不清楚询问的是什么。那代码必须初始化x,y和z吗?“获取值1”是什么意思?这是做什么用的?如果是x86,什么模式?16位?32位?64位?如果是16位,可以使用32位指令吗?我编辑它。“获取值1”意味着在指令x=y=z=1之后执行hank u!!摩托罗拉68000怎么样?是真的吗:MOVEQ.L#0x00010100,x MOVEQ.B#0x01,x+4我对摩托罗拉不太熟悉。您最初询问了x86。例如(假设使用“类似NASM”的语法),
x:dw 0
表示
x
位于初始化的数据部分(例如
.data
);和
y
z
使用
resb
/
resw
,这意味着它们位于未初始化的数据部分(例如
.bss
)。我没有看到任何东西可以保证
x
的地址与其他变量的地址接近。这种差异可能是由于简单的打字错误或其他原因造成的。@Brendan NASM不太关心章节。除非您明确告诉它更改当前节,否则所有内容都将进入同一个当前节,不管它是代码、初始化数据还是未初始化数据。@AlexeyFrunze:请尝试在初始化数据节中使用
resw
,然后在未初始化数据节中尝试使用
dw
;然后再次提醒我NASM是多么的不关心章节。谢谢!!摩托罗拉68000怎么样?是真的吗:MOVEQ.L#0x00010100,x MOVEQ.B#0x01,x+4我对摩托罗拉不太熟悉。您最初询问了x86。例如(假设使用“类似NASM”的语法),
x:dw 0
表示
x
位于初始化的数据部分(例如
.data
);和
y
z
使用
resb
/
resw
,这意味着它们位于未初始化的数据部分(例如
.bss
)。我没有看到任何东西可以保证
x
的地址与其他变量的地址接近。这种差异可能是由于简单的打字错误或其他原因造成的。@Brendan NASM不太关心章节。除非您明确告诉它更改当前节,否则所有内容都将进入同一个当前节,不管它是代码、初始化数据还是未初始化数据。@AlexeyFrunze:请尝试在初始化数据节中使用
resw
,然后在未初始化数据节中尝试使用
dw
;然后再次提醒我NASM是多么不关心章节。