小编Cat*_*tie的帖子

汇编语言为C.

所以我有以下汇编语言代码,我需要将其转换为C.我对代码的几行感到困惑.

我知道这是一个for循环.我在每一行都添加了我的评论.

我认为for循环是这样的

for (int i = 1; i > 0; i << what?) {
    //Calculate result
}
Run Code Online (Sandbox Code Playgroud)

测试条件是什么?我该如何改变呢?

查看汇编代码,变量'n'有什么作用?

这是Intel x86,因此格式为movl = source,dest

  movl 8(%ebp), %esi     //Get x
  movl 12(%ebp), %ebx    //Get n
  movl $-1, %edi         //This should be result
  movl $1, %edx          //The i of the loop
.L2:
  movl %edx, %eax
  andl %esi, %eax
  xorl %eax, %edi        //result = result ^ (i & x)
  movl %ebx, %ecx        //Why do we do this? As we …
Run Code Online (Sandbox Code Playgroud)

c assembly bit-shift

8
推荐指数
1
解决办法
1万
查看次数

开关盒组装语言

我正在查看switch语句的汇编语言代码.

我理解代码如何工作以及案例是什么.我的问题是我如何决定案件名称?

下面是汇编语言代码,我将对其进行解释.我基本上只需要使用跳转表并填写案例名称.

    1 8048420: push %ebp
    2 8048421: mov %esp, $ebp
    3 8048423: mov 0x8(%ebp), %eax       // x
    4 8048426: mov 0xc(%ebp), %edx       // n
    5 8048429: sub $0x32, %edx           // so least value of case is 32
    6 804842c: cmp $0x5, %edx            // max value is 37
    7 804842f: ja 8048448 <switch+0x28>  // if >37, go to default
    8 8048431: jmp *0x80485d0(, %edx, 4)  //THIS RIGHT HERE ?
    9 8048438: shl $0x2, %eax             // CASE A
   10 804843b: …
Run Code Online (Sandbox Code Playgroud)

x86 assembly disassembly switch-statement

8
推荐指数
1
解决办法
2万
查看次数

计算BST中左节点的数量

给定BST,我需要找到树的左节点数.

示例:`

          +---+
          | 3 |
          +---+
         /     \
     +---+     +---+
     | 5 |     | 2 |
     +---+     +---+
    /         /     \
+---+     +---+     +---+
| 1 |     | 4 |     | 6 |
+---+     +---+     +---+
         /
     +---+
     | 7 |
     +---+`
Run Code Online (Sandbox Code Playgroud)

答案应该是4,因为(5,1,4,7)都是树的左节点.

我在想的是:

public int countLeftNodes() {
    return countLeftNodes(overallRoot, 0);
}

private int countLeftNodes(IntTreeNode overallRoot, int count) {
    if (overallRoot != null) {
        count += countLeftNodes(overallRoot.left, count++);    
        count = countLeftNodes(overallRoot.right, count);
    }
    return count;
}
Run Code Online (Sandbox Code Playgroud)

我知道这是错的,但我不知道为什么.有人可以解释原因,并帮助我解决问题.

binary-tree

8
推荐指数
1
解决办法
6058
查看次数

添加到链接列表的前面

我很困惑如何添加到链表的前面.

/**
* data is added to the front of the list
* @modifies this
* @ffects 2-->4-->6 becomes data-->2-->4-->6
*/
public void insert(E data) {
    if (front == null) 
        front = new Node(data, null);
    else {
        Node temp = new Node(data, front);
        front = temp;
    }
}
Run Code Online (Sandbox Code Playgroud)

这创造了一个循环.我该如何避免?

我有一个LinkedList类,它将前端节点保存在一个名为front的变量中.我在这个LinkedList类中有一个Node类.

任何帮助,将不胜感激.谢谢.

java linked-list

5
推荐指数
2
解决办法
5万
查看次数

使用 snprintf 的缓冲区溢出

这是一项作业,但我在基本理解方面遇到了问题。

易受攻击的代码:

int choc(char *arg)
{
  char buf[400];
  snprintf(buf, sizeof buf, arg);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

我知道 arg 需要是一个格式字符串,它将用我要执行的代码的地址覆盖返回地址。但是我在创建格式字符串时遇到了问题。

因此,格式字符串需要具备的内容:

  1. 返回指令的地址,我需要覆盖它
  2. %x 的列表
  3. 我会写在返回地址上的值。这将是我要执行的代码的地址。

为了获得返回地址,我只需要查看gdb中'ret'指令的地址,对吗?%x 的目的究竟是什么?以及如何在格式字符串中对要执行的代码的地址进行编码?

我做的一个测试:使用gdb我发现我的buf的地址是0xbffffba0。我生成的 arg 为 "\xa0\xfb\xff\xbf_%x.%x.%n"; 这不应该在地址 0xbffffba0 处向 buff 的开头写入一些值吗?但是我得到了一个段错误。我究竟做错了什么?

任何帮助,将不胜感激!

c buffer

5
推荐指数
1
解决办法
1万
查看次数

递归数字打印

如果给我们5号,它需要在控制台上打印出来,如1,2,3,4,5.这需要递归完成.(最好是Java)

如果有人想知道这些不是作业问题.我从现在起一周内练习中期.

很抱歉没有发布我的作品.我正在做类似下面的事情:但是对于打印其余数字的位置感到困惑,以及如何使用(n - 1)递归调用方法.雅各布和他的职位帮助了我.感谢所有帮助过的人.

public void writeNums(int n) {
    if (n < 1)
        throw new IllegalArgumentException();
    if (n == 1) {
        System.out.print("1, ");
    }
    writeNums(n - 1);
Run Code Online (Sandbox Code Playgroud)

java recursion

1
推荐指数
1
解决办法
1万
查看次数