【问题标题】:Incrementing a pointer by 1 in an array of words: loading a word from half way between two words?在单词数组中将指针增加 1:从两个单词之间加载一个单词?
【发布时间】:2021-10-03 03:53:42
【问题描述】:

考虑下面的代码。如果将 SI 增加 2 给我数组的第二个元素,那么将 SI 增加 1 到底会给我什么?

.data  
var dw 1,2,3,4  
.code  
LEA SI,VAR  
MOV AX,[SI]  
INC SI  
MOV AX,[SI]

【问题讨论】:

  • 提示:逐字节写出var的内存内容。请记住,x86 是 little-endian。

标签: arrays assembly x86-16 masm


【解决方案1】:

语句var dw 1,2,3,4 告诉汇编器在内存中静态定义.data 段开头的八个字节。数据字节的布局将是

|01|00|02|00|03|00|04|00|

第一个 MOV AX,[SI] 将加载 01 的 AL 和 00 的 AH。
当您将 SI 仅增加 1 时,下一个 MOV AX,[SI] 将加载 00 的 AL 和 02 的 AH。
如果您想继续用整个 16 位字加载 AX,请将 SI 增加 2 (ADD SI,2)。

您还可以将MOV AX,[SI]ADD SI,2 替换为一条指令LODSW,它的作用相同,并且只占用一个字节而不是五个。在这种情况下,您应该确保重置方向标志(使用程序开头的指令CLD)。

【讨论】:

  • Nitpick: lodsw 不会像 add 那样改变标志。
  • @ecm 确实,用INC SI + INC SI 替换ADD SI,2 不会像ADD 那样改变CF :-)
  • Flags-wise 这个LODSW 相当于MOV AX, [SI] LEA SI, [SI+2]
猜你喜欢
  • 2015-09-08
  • 1970-01-01
  • 2012-08-20
  • 2018-12-31
  • 1970-01-01
  • 2020-04-21
  • 1970-01-01
  • 2012-04-13
  • 1970-01-01
相关资源
最近更新 更多