【问题标题】:assembly-shortest code for instruction指令的汇编最短代码
【发布时间】:2012-10-15 21:08:30
【问题描述】:

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

但是。不好...应该打印 1

【问题讨论】:

  • 不清楚在问什么。该代码是否必须初始化 x、y 和 z? “获取值 1”是什么意思?这是什么CPU用的?如果是x86,什么模式? 16位? 32位? 64位?如果是16位,可以用32位指令吗?
  • 我编辑它。 “取值 1”表示在指令 x=y=z=1 之后

标签: assembly x86


【解决方案1】:

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

xx XX yy zz ZZ

其中xxx (0) 的最低有效字节,XXx (0xFF) 的最高有效字节,yz 也是如此。

如果我理解正确,yz 不会被初始化(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 MOVs(NASM 语法):

mov dword [x], 0x01010001
mov byte [x+4], 0

【讨论】:

  • 谢谢你!!摩托罗拉68000怎么样?是真的吗:MOVEQ.L #0x00010100, x MOVEQ.B #0x01, x+4
  • 我对摩托罗拉不是很熟悉。您最初询问的是 x86。
  • 对于示例(假设“类似 NASM”的语法),x: dw 0 意味着 x 在初始化的数据部分中(例如 .data);而yz 使用resb/resw,这意味着它们位于未初始化的数据部分(例如.bss)。我没有看到任何东西可以保证x 的地址与其他变量的地址接近。差异可能是由简单的拼写错误或其他原因引起的。
  • @Brendan NASM 不太关心部分。除非您明确告诉它更改当前部分,否则所有内容都会进入同一个当前部分,无论它是代码、已初始化或未初始化数据。
  • @AlexeyFrunze:请尝试在初始化的数据段中使用resw,然后尝试在未初始化的数据段中使用dw;然后再次提醒我 NASM 有多少不关心部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-28
  • 2014-05-27
  • 2018-05-31
  • 2022-01-23
  • 2016-04-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多