【问题标题】:C assembly error for a given array给定数组的 C 汇编错误
【发布时间】:2017-10-03 18:21:18
【问题描述】:

我有以下 c 汇编代码,它按降序对数组进行排序,我已经使用 8086emu 对其进行了测试,它可以 100% 工作,但在 Visual Studio 中它给了我错误的结果和错误。任何想法或如何解决这个问题。

我的代码:-

#include "stdafx.h"
#include <iostream>
using namespace std;


void main(void)
{
short *arr;
arr = new short[10];
cout << "please enter the array elements" << endl;
for (int i = 0; i < 10; i++)
{
    cin >> arr[i];
}

short *p;
p = arr;
_asm{

START:
    mov cx, 9
        mov esi, p

    LABEL2 :
    MOV ax, [esi]
        CMP ax, [esi + 2]
        JGE LABEL1
        MOV bx, [esi + 2]
        MOV word ptr[esi], bx
        MOV word ptr[esi + 2], ax
        JMP START

    LABEL1 :
    inc esi
        inc esi
        LOOP LABEL2

}

for (int i = 0; i < 10; i++)
{
    cout << arr[i] << endl;
}

}

【问题讨论】:

  • 组装完成了多远?你做了什么来调试这个?
  • @PaulBentley 我没有调试过,它在输入数组元素后直接出现,但是 ASM 块内的相同代码适用于 Masm 和 emu。
  • loop 可能会减少和检查ecx,而不仅仅是较低的单词 (cx)。如果您使用mov ecx,9 而不是mov cx,9 会怎样?
  • @Michael Ohhhhhhhh 谢谢你的工作,谢谢

标签: arrays assembly inline-assembly emu8086


【解决方案1】:

问题已由 Michael 在a comment 中解决。

问题是我使用的是LOOP instruction,它隐式递减并测试ECX 寄存器。但是,当我在循环的顶部初始化寄存器时,我只初始化了它的低位字(mov cx, 9),这在高位字中留下了垃圾。

解决办法是初始化完整的ECX寄存器:mov ecx, 9

【讨论】:

  • 顺便说一下,LOOP 是一个非常缓慢且过时的指令。你真的根本不应该使用它。它等同于dec ecx+jnz ???,而这正是您应该使用的。如果您以这种方式编写它,您的代码不仅会更快、更惯用,而且您也很容易发现这个错误。 (但更一般地说,您根本不应该在这里编写内联汇编。这是 C 编译器可以轻松生成和优化的代码。您的汇编代码更慢且更容易出错。如果您尝试 学习汇编语言编程,不要使用C编译器。)
  • @CodyGray 哦,非常感谢,我会记住这一点,但为什么我不应该使用 C 编译器?!
  • 如果您想学习汇编语言,请使用汇编程序,如 MASM 或 NASM,并在汇编中编写所有代码。内联汇编是一种可怕而复杂的野兽,它不是学习汇编的好方法。
  • @CodyGray 当然,我使用它们,但这是一个硬件,所以我必须使用 C 程序集,顺便说一下,这是我用过的最难的编程语言,它很复杂!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-17
  • 1970-01-01
  • 2016-09-26
  • 2021-09-25
相关资源
最近更新 更多