Loops 程序集计数为零
我试图自学汇编(出于好奇和学习兴趣),并开发了一些从5到0的代码。这就是它的全部功能。我想知道下面的代码是否有效Loops 程序集计数为零,loops,assembly,mov,Loops,Assembly,Mov,我试图自学汇编(出于好奇和学习兴趣),并开发了一些从5到0的代码。这就是它的全部功能。我想知道下面的代码是否有效 .386 .model flat, stdcall .data i dd 5 .code main: MOV cx, 5 lp: LOOP lp MOVZX eax, cx RET END main 请注意,我使用MOVZX指令将cx的值复制到eax(我的编译器使用它返回)。 我这样做是因为如果我简单地使用MOV,我的程序就不会汇编。是否需
.386
.model flat, stdcall
.data
i dd 5
.code
main:
MOV cx, 5
lp:
LOOP lp
MOVZX eax, cx
RET
END main
请注意,我使用MOVZX
指令将cx
的值复制到eax
(我的编译器使用它返回)。
我这样做是因为如果我简单地使用MOV
,我的程序就不会汇编。是否需要使用MOVZX
?或者有没有更有效的方法
您还会注意到,在我的代码中,我有
I dd 5
我最初的计划是MOV-cx,I
,但当我尝试这样做时,我的编译器拒绝汇编。(MOVSX
产生相同的结果)。因此,我的第二个问题是,如何将I
的值移动到cx
寄存器中?如果为32位目标写入,则使用ecx
寄存器而不是16位cx
寄存器。然后,您将能够使用moveax、ecx
,而无需汇编程序抱怨操作数大小。另外,循环
指令隐式使用了ecx
,因此您需要确保整个寄存器的初始化值为5,而不仅仅是较低的16位
使用
ecx
后,指令mov ecx,i
可能会工作-但您没有说明在尝试该操作时遇到的实际错误。您的代码效率不高,不。循环指令很旧,很少再使用,因为它的执行效果不如手动递减
您可以通过对寄存器本身进行XORing将其归零,然后通过立即加法将一个数字加载到寄存器中。我不太使用汇编语言,因此我没有完整的语法,不幸的是,我无法发布一个示例。这里有一个与您类似的C示例:
#include <stdio.h>
int i = 5;
int
main (int argc, char *argv[])
{
while (--i >= 0)
;
return 0;
}
很好,谢谢。我想我应该研究一下我可用的不同寄存器:)寄存器根据其宽度有不同的名称。没有前缀的寄存器为16位宽。前缀为“E”的寄存器为32位,前缀为“R”的寄存器为64位。最重要的是,具有相同基名称的寄存器共享低阶位。如果你先将一些东西加载到EAX,然后再将一些东西加载到AX,EAX的低16位将发生变化。我知道关于异或的事,但只是在试验。我不知道
循环
很少使用,谢谢你的回答。
.386P
include listing.inc
if @Version gt 510
.model FLAT
else
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
_DATA SEGMENT DWORD USE32 PUBLIC 'DATA'
_DATA ENDS
CONST SEGMENT DWORD USE32 PUBLIC 'CONST'
CONST ENDS
_BSS SEGMENT DWORD USE32 PUBLIC 'BSS'
_BSS ENDS
_TLS SEGMENT DWORD USE32 PUBLIC 'TLS'
_TLS ENDS
FLAT GROUP _DATA, CONST, _BSS
ASSUME CS: FLAT, DS: FLAT, SS: FLAT
endif
PUBLIC _i
_DATA SEGMENT
_i DD 05H
_DATA ENDS
PUBLIC _main
_TEXT SEGMENT
_main PROC NEAR
; File x.c
; Line 7
push ebp
mov ebp, esp
$L342:
; Line 8
mov eax, DWORD PTR _i
sub eax, 1
mov DWORD PTR _i, eax
cmp DWORD PTR _i, 0
jl SHORT $L343
; Line 9
jmp SHORT $L342
$L343:
; Line 10
xor eax, eax
; Line 11
pop ebp
ret 0
_main ENDP
_TEXT ENDS
END