小编Mic*_*tch的帖子

汇编程序给出错误:/a.out:无法执行二进制文件:Exec格式错误

我是 64 位 x86 编码新手,但我运行的是 Ubuntu 14.04(可靠),并且我有一段非常简单的 64 位代码,我使用as进行汇编。我得到的输出具有奇怪的权限和文件类型。

当我跑步时:

as file.s
Run Code Online (Sandbox Code Playgroud)

我得到一个具有 770 权限的文件a.out

当我执行它时,我得到这个错误:

bash: ./a.out: 无法执行二进制文件: Exec 格式错误

当我跑步时:

file ./a.out 
Run Code Online (Sandbox Code Playgroud)

我得到:

./a.out:ELF 64 位 LSB 可重定位,x86-64,版本 1 (SYSV),未剥离

我使用的汇编代码是:

.section    .data
.LC0:
    .string "/bin/sh"

.LC1:
    .string "/bin/sh"

.LC3:
    .quad .LC1, 0

    .text
    .globl  _start
_start:
.LFB0:

    pushq   %rbp
    movq    %rsp, %rbp

    movq    $59,%rax     # System Call to execve
    movq    $.LC0, %rdi  # Pass program to execute
    movq    $.LC3, %rsi  # Pass command …
Run Code Online (Sandbox Code Playgroud)

x86 assembly x86-64 gnu-assembler ubuntu-14.04

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

这种交换在推送寄存器方面有多安全?

我是Assembly的新手,下面的代码应该通过两个不同的函数交换两个整数:首先使用swap_c然后再使用swap_asm.

但是,我怀疑,我是否需要push(我的意思是保存)汇编代码之前的每个寄存器值以及pop它们之后(就在返回之前main).换句话说,如果我在运行函数后返回不同的寄存器内容(不是像ebp或者esp只是eax,但是,只是ebx,ecx&edx),CPU会不会生我的气swap_asm?取消组装部件中的线条是否更好?

这段代码对我来说运行正常,我设法将27行汇编C代码减少到7个装配线.

ps:系统是Windows 10,VS-2013 Express.

main.c 部分

#include <stdio.h>

extern void swap_asm(int *x, int *y);

void swap_c(int *a, int *b) {
    int t = *a;
    *a = *b;
    *b = t;
}

int main(int argc, char *argv[]) {
    int x = 3, y = 5;
    printf("before swap    => x = %d     y = …
Run Code Online (Sandbox Code Playgroud)

c x86 assembly masm visual-studio

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

有没有办法在Spring引导中获取所有配置属性的名称?

我真的很喜欢Spring.我使用spring boot提供的外部配置功能.它运行良好,我在几个配置类中使用它,通常只使用默认值.现在我想概述一下我使用的配置属性.这意味着我需要知道所有使用@Value(...)或设置的属性@ConfigurationProperties(prefix = ...).有没有办法从Spring获取此信息?我可以用反射做到这一点,但我认为这不是最好的方法.

java configuration spring properties spring-boot

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

模拟器使用 int21h/ah=09h 显示“在 2000 个字节之后找不到错误字节 24h”

我必须使用EMU8086在汇编中做一个简单的计算器,但每次我尝试启动它时,EMU8086都会出现此错误:

INT 21h, AH=09h - 
address: 170B5
byte 24h not found after 2000 bytes.
; correct example of INT 21h/9h:
mov dx, offset msg
mov ah, 9
int 21h
ret
msg db "Hello$"
Run Code Online (Sandbox Code Playgroud)

我检查了其他东西,但没有错误:

data segment
    choice db ?
    snum1 db 4 dup(?)
    snum2 db 4 dup(?)
    sres db 4 dup(?)
    num1 db ?
    num2 db ?
    res db ?
    ;;menu1 db "Chose a function to procced", 10, 13, "Add [+]", 10, 13, "Sub [-]", 10, …
Run Code Online (Sandbox Code Playgroud)

x86 assembly dos x86-16 emu8086

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

INT 16h/AH=0h 不等待引导加载程序中的按键

我使用 GNU 汇编器和 AT&T 语法编写了我的第一个引导加载程序。它应该打印hello world到屏幕上,然后通知用户按任意键将导致重新启动。只有按下某个键后才会启动重新启动。我的引导加载程序代码不等待按键,并在打印信息后自动重新启动。为什么此代码不等待击键,我该如何修复它?

我的引导扇区代码:

#generate 16-bit code
.code16

#hint the assembler that here is the executable code located
.text
.globl _start;
#boot code entry
_start:
  jmp _boot                           #jump to boot code
  welcome: .asciz "Hello, World\n\r"  #here we define the string
  AnyKey: .asciz "Press any key to reboot...\n\r"
 .macro mWriteString str              #macro which calls a function to print a string
      leaw  \str, %si
      call .writeStringIn
 .endm

 #function to print the string
 .writeStringIn:
      lodsb
      orb  %al, %al …
Run Code Online (Sandbox Code Playgroud)

assembly gnu-assembler bootloader att x86-16

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

在弹簧启动执行器中设置endpoints.health.sensitive = false时无效

在我的application.yml中:

endpoints:
  restart:
    enabled: true
  shutdown:
    enabled: true
  health:
    sensitive: false
Run Code Online (Sandbox Code Playgroud)

但是当我要求/健康时,我总是得到:

{"status":"UP"}
Run Code Online (Sandbox Code Playgroud)

有什么想法获取更多信息吗?

spring spring-boot actuator

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

使用x87 FPU将浮点转换为带截断的整数,而不是舍入

所述FISTP指令改变0.75至1(因为四舍五入)

我希望0.75变成0而不是1.

是否有FIST/FISTP的替代方法可以截断而不是舍入

assembly nasm x87

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

在没有编译器的情况下创建C函数会生成序言/结尾和RET指令?

考虑以下功能:

void foo(){
    //do something
}
Run Code Online (Sandbox Code Playgroud)

在组装时,它看起来像这样(不准确):

push something

;do stuff

pop something
ret
Run Code Online (Sandbox Code Playgroud)

但是我不想要这个生成的代码(RETPUSHPOP ...)。我只想在代码块上加上标签,所以我必须返回自己:

void bar(){
    //do something
    asm("iret") //i want to use this function as a ISR
}
Run Code Online (Sandbox Code Playgroud)

并在组装中看起来像这样:

; do something
iret
Run Code Online (Sandbox Code Playgroud)

没有PUSHPOPRET。是否有任何预处理器指令或关键字可以帮助我完成此任务?

我正在Windows下使用GCCNASM,并且试图生成自己的中断服务例程(ISR)。

c x86 assembly gcc nasm

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

Spring启动应用程序在没有-Djava.net.preferIPv4Stack = true和-Djava.net.preferIPv4Addresses参数的情况下侦听IPv6


关于Spring boot jar的问题.在生产机器上运行jar时:

java -jar xyz.jar

它不响应我的要求.因为它正在监听ipv6.

但当我运行应用程序为
java -jar xyz.jar -Djava.net.preferIPv4Stack = true -Djava.net.preferIPv4Addresses时

它回应了我的要求.

是生产机器的配置导致应用程序通过ipv6监听,还是有其他原因?

幸运的是
-Djava.net.preferIPv4Stack = true
-Djava.net.preferIPv4Addresses
参数解决了我的问题.但我很困惑!!

注意:Tomcat用作嵌入式服务器.
Spring启动版1.5.4 RELEASE

spring jar ipv4 ipv6 spring-boot

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

GNU汇编程序x86指令后缀如"mov.s"中的".s"如何工作?

GNU汇编程序似乎有一些方法可以控制为某些指令发出的操作码的替代形式.例如

.intel_syntax noprefix
mov   eax, ecx
mov.s eax, ecx
Run Code Online (Sandbox Code Playgroud)

处理上面的代码as test.s -o test.o && objdump -d test.o -M intel给出了以下反汇编:

0:   89 c8                   mov    eax,ecx
2:   8b c1                   mov    eax,ecx
Run Code Online (Sandbox Code Playgroud)

我们可以看到.s后缀似乎将89操作码切换到8b版本(并适当地更改了ModRM字节).

这种语法在GAS中如何工作?我找不到任何相关文件.

x86 assembly gnu-assembler objdump intel-syntax

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