小编Mic*_*tch的帖子

LEA指令的目的是什么?

对我来说,它看起来像一个时髦的MOV.它的目的是什么,我什么时候应该使用它?

x86 assembly x86-64 x86-16

632
推荐指数
15
解决办法
54万
查看次数

测试点%eax%eax

可能重复:
x86汇编 - 针对eax的'testl'eax?

我对汇编语言编程非常陌生,我目前正在尝试阅读从二进制文件生成的汇编语言.我跑过去了

 test   %eax,%eax
Run Code Online (Sandbox Code Playgroud)

或者test %rdi, %rdi等等.我很困惑这是做什么的.这些价值不%eax, %eax一样吗?什么是测试?我在某处读到它正在进行AND操作.....但由于它们是相同的值,它不会只返回%eax吗?

以下是我发现此用法的一个实例:

   400e6e:       85 c0                   test   %eax,%eax
   400e70:       74 05                   je     400e77 <phase_1+0x23>
Run Code Online (Sandbox Code Playgroud)

je如果被比较的两个值相等,我认为跳跃......好吧,因为 %eax很好,本身,在什么情况下我们不会跳?

我是一般的编程初学者,所以如果有人能向我解释这一点,我会非常感激.谢谢!

x86 assembly att

122
推荐指数
4
解决办法
15万
查看次数

117
推荐指数
7
解决办法
16万
查看次数

`testl` eax对抗eax?

我想了解一些装配.

汇编如下,我对该testl行感兴趣:

000319df  8b4508        movl   0x08(%ebp), %eax  
000319e2  8b4004        movl   0x04(%eax), %eax  
000319e5  85c0          testl  %eax, %eax  
000319e7  7407          je     0x000319f0  
Run Code Online (Sandbox Code Playgroud)

我想了解的那点testl之间的%eax%eax?我认为这段代码的具体内容并不重要,我只是试图用自己来理解测试 - 这种价值总是不正确吗?

x86 assembly instructions

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

LEA或ADD指令?

当我手写组装时,我通常会选择表格

lea eax, [eax+4]
Run Code Online (Sandbox Code Playgroud)

在表格上..

add eax, 4
Run Code Online (Sandbox Code Playgroud)

我听说lea是一个"0时钟"指令(如NOP),而'add'则不是.但是,当我看到编译器生成的程序集时,我经常看到后一种形式而不是第一种.我足够聪明地相信编译器,所以任何人都可以了解哪一个更好?哪一个更快?为什么编译器选择后一种形式呢?

x86 assembly

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

无法写入C中的屏幕内存

我是C的新手,它是继Java之后的第二种高级编程语言.我已经掌握了大部分基础知识,但无论出于何种原因,我无法将单个字符写入屏幕内存.

该程序使用Turbo C for DOS编译,运行速度为120mhz的Am486-DX4-100.该显卡是使用Trio32芯片的非常标准的VLB Diamond Multimedia Stealth SE.

对于操作系统,我运行的PC-DOS 2000加载了ISO代码页.我正在使用标准的MDA/CGA/EGA/VGA 80列文本模式运行.

这是我编写的程序:

#include <stdio.h>

int main(void) {
    unsigned short int *Video = (unsigned short int *)0xB8000;
    *Video = 0x0402;
    getchar();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

正如我所说,我对C很新,所以如果我的错误显而易见,我道歉,我无法找到一个可以理解的如何做到这一点的可靠来源.

据我所知,在x86平台上的实模式下,文本模式的屏幕内存从0xB8000开始.每个字符存储在两个字节中,一个用于字符,一个用于背景/前景.我的想法是将值0x0402(应该是一个红色的笑脸)写入0xB8000.这应该放在屏幕的左上角.

我已经考虑了屏幕可能滚动的可能性,因此在执行时会立即以两种方式删除我的角色.要解决此问题,我尝试过:

  • 使用循环重复写入此值
  • 再写下来吧.

我可以读取并打印我写入内存的值,所以它显然仍然在内存中,但无论出于何种原因,我都没有在屏幕上显示任何内容.我显然做错了,但我不知道会出现什么问题.如果需要任何其他细节,请询问.感谢您提供任何可能的帮助.

c x86 real-mode turbo-c x86-16

43
推荐指数
2
解决办法
3667
查看次数

弹出x86堆栈时出现分段错误

我正在尝试将x86程序集和C链接。

我的C程序:

extern int plus_10(int);

# include <stdio.h>

int main() {
    int x = plus_10(40);
    printf("%d\n", x);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我的汇编程序:

[bits 32]

section .text

global plus_10
plus_10:
    pop edx
    mov eax, 10
    add eax, edx
    ret
Run Code Online (Sandbox Code Playgroud)

我编译并链接两个如下:

gcc -c prog.c -o prog_c.o -m32
nasm -f elf32 prog.asm -o prog_asm.o
gcc prog_c.o prog_asm.o -m32
Run Code Online (Sandbox Code Playgroud)

但是,当我运行结果文件时,出现了分段错误。

但是当我更换

流行版

mov edx,[esp + 4]

该程序工作正常。有人可以解释为什么会这样吗?

c x86 assembly gcc nasm

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

`test`指令有什么作用?

我正在查看一些小的汇编代码,我无法理解TEST指令及其用法.我在循环结束时查看以下代码:

8048531:    84 c0                   test   al,al
8048533:    75 dc                   jne    8048511 <function+0x2d>
Run Code Online (Sandbox Code Playgroud)

我理解TEST的方式是它有点像AND运算符,它设置了一些标志.我想我真的不明白旗帜是如何运作的.test al,al对我来说,它看起来像检查相同的低位,并将始终得到相同的结果.

谁能解释一下?

x86 assembly

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

Spring Boot Java Config设置会话超时

如何在Spring Boot应用程序中配置我的(嵌入式)Tomcat会话超时?

public class SessionListener implements HttpSessionListener{

@Override
public void sessionCreated(HttpSessionEvent se) {
    se.getSession().setMaxInactiveInterval(5*60);
}

@Override
public void sessionDestroyed(HttpSessionEvent se) {

}}
Run Code Online (Sandbox Code Playgroud)

我有一个SessionListener,但我不知道在哪个类中我必须将此监听器添加到Context.

session spring timeout spring-boot

26
推荐指数
3
解决办法
7万
查看次数

在x86中,"test eax,eax"和"cmp eax,0"之间有什么区别

test eax, eax不是更有效cmp eax, 0?是否有test eax, eax必要在cmp eax, 0不满足要求的地方?

x86 assembly

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