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