Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops 程序集计数为零_Loops_Assembly_Mov - Fatal编程技术网

Loops 程序集计数为零

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,我的程序就不会汇编。是否需

我试图自学汇编(出于好奇和学习兴趣),并开发了一些从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
,我的程序就不会汇编。是否需要使用
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