Arrays 如何在汇编语言中切换数组的第一和第二、第三和第四等元素并以dec输出?

Arrays 如何在汇编语言中切换数组的第一和第二、第三和第四等元素并以dec输出?,arrays,assembly,x86,masm,irvine32,Arrays,Assembly,X86,Masm,Irvine32,我是汇编语言(MASM)的新手,我想用一个单词数组来切换第一和第二个元素,第三和第四个元素,等等。我基本上知道如何做,但我不知道如何将edi放入16位寄存器。最后,我如何得到它,以便它以十进制格式输出交换值数组?这就是我目前所拥有的 TITLE ArrayCode INCLUDE Irvine32.inc .DATA warray WORD 4,9,13,7,5,12,17,2,15,8 .CODE main PROC xor eax,eax xor ebx,ebx

我是汇编语言(MASM)的新手,我想用一个单词数组来切换第一和第二个元素,第三和第四个元素,等等。我基本上知道如何做,但我不知道如何将edi放入16位寄存器。最后,我如何得到它,以便它以十进制格式输出交换值数组?这就是我目前所拥有的

TITLE ArrayCode
INCLUDE Irvine32.inc

 .DATA
    warray WORD 4,9,13,7,5,12,17,2,15,8 

 .CODE
 main PROC

 xor eax,eax
 xor ebx,ebx
 mov esi, OFFSET warray
 mov edi, [esi+2]
 mov ecx, 5

 L1:
 mov ax,[esi]
 ;Want to move edi into bx
 mov [esi+2],ax
 mov [esi],bx
 movzx eax,bx ;Can i use this to fill the 16 bit and move it into the eax, and then use writeDec?
 add esi, TYPE warray     
 loop L1

 ;Want to display array. Maybe another loop? 
 call writeDec

 call WaitMsg
 EXIT
 main ENDP
 end main

欢迎来到SO!当你提出一个问题时,试着添加一个最小的内容:输入样本、预期输出样本、你尝试了什么、研究以及你在哪里。我们可以看到您的代码,但请向我们解释您的堆叠位置。您需要在覆盖
[esi+2]
之前加载这两个代码。但是是的,单词大小的加载/存储是有效的。您可以使用
movzx ebx,word ptr[esi+2]
使负载零扩展到完整寄存器,以避免写入部分寄存器时出现性能问题。比如在(bug使用的存储区太宽)或者当然你可以只
rol dword ptr[esi],16
来交换一半的dword。请注意,
添加esi,键入warray
仅前进1个元素,而不是2个。如果这是一个愚蠢的问题,很抱歉,但是movzx ebx,word ptr[esi+2]做什么?我不想只使用bx吗?它将一个字从内存扩展到EBX()。是的,您只关心它作为一个16位值,但是写入BX必须与现有的EBX高字节合并。执行零扩展负载有利于提高性能,避免任何部分寄存器性能的奇怪现象
movzx
是以32位x86代码加载字节或字的“正常”方式,例如相当于MIPS上的
lbu
lhu
。经验法则:不要写入部分寄存器。写入完整寄存器后读取窄寄存器是可以的,因此字存储仍然是
mov[esi],bx