小编Mic*_*tch的帖子

nasm/ld“重新定位被截断以适应:R_386_16”

集会:

[BITS 16]

global _start

_start:
    mov ax, 0x07C0
    mov ds, ax

    mov si, hw
    call print_string
    jmp $

print_string:
    mov ah, 0x0E
.char:
    lodsb
    cmp al, 0
    je .exit
    int 0x10
    jmp .char
.exit: ret

times 0x100-($-$$) db 0

hw: db "Hello, World!", 0

times 510-($-$$) db 0
dw 0xAA55
Run Code Online (Sandbox Code Playgroud)

组装这个:

$ nasm file.asm -felf -o file.o
Run Code Online (Sandbox Code Playgroud)

然后将其与:

$ ld -melf_i386 -o file.bin file.o --oformat binary
Run Code Online (Sandbox Code Playgroud)

给出以下错误:

file.asm:(.text+0x6): relocation truncated to fit: R_386_16 against `.text'
Run Code Online (Sandbox Code Playgroud)

在稍微摆弄代码后,我发现更改mov si, hw …

assembly nasm ld bootloader x86-16

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

x86程序集中"imul"指令的不熟悉语法

我写了一个非常基本的C函数叫做"multby22",它完全符合它的名字所暗示的:它需要很长的时间并且返回那么长的乘以22.(我知道这是一个没有意义的函数,但我写了它试图帮助我用x86汇编.)所以:

long multby22(long x) {
    return 22 * x;
}
Run Code Online (Sandbox Code Playgroud)

当我编译程序并在可执行文件上运行"objdump"时,我发现"multby22"的反汇编代码如下:

080483ff <multby22>:
   80483ff:       55                    push   %ebp              
   8048400:       89 e5                 mov    %esp,%ebp         // Create the stack frame.
   8048402:       8b 45 08              mov    0x8(%ebp),%eax    // Grab the argument and put it into the %eax register.
   8048405:       6b c0 16              imul   $0x16,%eax,%eax   // ???
   8048408:       5d                    pop    %ebp              // Pop the buffer pointer and return.
   8048409:       c3                    ret   
Run Code Online (Sandbox Code Playgroud)

我理解"imul"用于整数乘法,但我无法找到任何能帮助我使用这种语法的东西!我找到的最接近的是:

imul [reg] [reg] [const]
Run Code Online (Sandbox Code Playgroud)

...将第二个和第三个参数相乘,然后放入第一个参数,该参数必须是寄存器.在我生成的程序集中,第一个参数是常量!

c x86 assembly

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

程序集数据类型限制和示例

我正在上汇编语言课程,这本书给了我一个数据类型列表:

  • BYTE - 8 位无符号整数
  • SBYTE - 8 位有符号整数
  • WORD - 16 位无符号整数
  • SWORD - 16 位有符号整数
  • DWORD - 32 位无符号整数
  • SDWORD - 32 位有符号整数
  • FWORD - 48 位整数
  • QWORD - 64 位整数
  • TBYTE - 80 位(10 字节)整数
  • REAL4 - 32 位(4 字节)短实数
  • REAL8 - 64 位(8 字节)长实数
  • REAL10 - 80 位(10 字节)扩展实数

正如标题所说,我希望获得有关每种数据类型的上限/下限的信息,也许还有一些示例。

size assembly types masm

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

加载引导加载程序的第二阶段

我正在尝试为x86机器创建一个小型操作系统,并开始为相当小的引导程序编写代码.我创建的引导加载程序非常简单,它从主引导记录之后的扇区加载一个小的第二个引导加载程序并跳转到该代码.主引导记录中的引导加载程序代码似乎运行正常,当它尝试跳转到第二阶段引导加载程序时会出现问题.这个第二阶段的引导加载程序应该输出一个表示成功的字母(字母S),这样我就能告诉代码正在执行.问题是屏幕上没有出现任何问题,所以我怀疑第二阶段的引导程序从未执行过.我使用的代码如下:

主引导记录中的Bootloader:

[BITS 16] ; 16 bit mode
[ORG 0x7C00] ; Boot loader start address

Boot:
    ; Initial, dl contains drive number
    ; Set data segment to code segment
    mov ax, cs
    mov ds, ax
    mov es, ax
    ; Set the stack segment to 0xA000
    add ax, 0xA000
    mov ss, ax
    mov sp, 0x00
    ; Reset the drive, dl contains drive number
    mov ah, 0x00
    int 0x13
    ; Read from drive, dl contains drive number
    ;     Set up output location …
Run Code Online (Sandbox Code Playgroud)

x86 assembly real-mode nasm bootloader

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

如何组装 .asm 文件并将其链接到 Win32 可执行文件?

我有NASM开发-CPP我的系统上安装。Dev-cpp带有LD(GNU 链接器)。我不熟悉汇编代码和从汇编程序文件创建 32 位 Windows 可执行文件的过程。我尝试使用这个:

nasm -f win32 ass.asm
nasm -o ass ass.o
Run Code Online (Sandbox Code Playgroud)

我使用这些命令创建可执行文件没有成功。组装(使用NASM)和链接以生成将在 32 位 Windows 上运行的可执行文件的正确方法是什么?

windows x86 assembly linker nasm

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

无法跳转或调用在0x8000加载的内核

我正在尝试开发一个操作系统.设计是这样的:我有一个加载在0x7c00的引导程序,它加载第二阶段并在0x7e00跳转到它.第二阶段也处于实模式并且执行许多操作,例如加载gdt,启用A20并切换到保护模式.它还在0x8000处加载一个非常简单的32位内核.现在的问题是我无法调用或jmp到0x8000,因为内核似乎没有加载(我在VirtualBox中进行了内存转储).我已经在第二阶段完成了FAR JMP来设置CS寄存器.我在VirtualBox中测试我的操作系统.

我的启动加载程序的代码:

org 0x7c00
bits 16
Start:
      jmp Reset
      bpbOEM DB "SKULLOS " 
      bpbBytesPerSector:    DW 512
      bpbSectorsPerCluster:     DB 1
      bpbReservedSectors:   DW 1
      bpbNumberOfFATs:      DB 2
      bpbRootEntries:       DW 224
      bpbTotalSectors:      DW 2880
      bpbMedia:                 DB 0xF0
      bpbSectorsPerFAT:         DW 9
      bpbSectorsPerTrack:   DW 18
      bpbHeadsPerCylinder:  DW 2
      bpbHiddenSectors:         DD 0
      bpbTotalSectorsBig:     DD 0
      bsDriveNumber:            DB 0
      bsUnused:                 DB 0
      bsExtBootSignature:   DB 0x29
      bsSerialNumber:           DD 0xa0a1a2a3
      bsVolumeLabel:            DB "MOS FLOPPY "
      bsFileSystem:             DB "SKFS    "
Set: …
Run Code Online (Sandbox Code Playgroud)

x86 assembly nasm osdev

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

Bootloader在真实硬件上打印垃圾

我正在尝试编写自己的bootloader.虽然它在QEMU,Bochs和VirtualBox中运行良好,但我似乎无法在笔记本电脑上运行.

在我的笔记本电脑上,引导加载程序与所有模拟器的行为完全不同,挂起看似随机的地方,拒绝打印,甚至跳过一些jmp $指令.

虽然我对"真实硬件"有很多麻烦,但我认为它们都有一个原因.

以下代码是一个短引导加载程序,应该打印"TEST"消息3次,然后跳转到同一位置挂起:

[BITS 16]                                                                          
[ORG 0x7C00]                                                                                                    
    jmp 0x0000:start_16  ; In case bootloader is at 0x07C0:0x0000                                                             
start_16:                                                                          
    xor ax, ax                                                                 
    mov ds, ax                                                                 
    mov es, ax                                                                 
    cli                             ; Disable interrupts                       
    mov ss, ax                                                                 
    mov sp, 0x7C00                                                             
    sti                             ; Enable interrupts                        
    cld                             ; Clear Direction Flag                     
    ; Store the drive number                                                   
    mov [drive_number], dl                                                     
    ; Print message(s)                                                         
    mov si, msg                                                                
    call print_string                                                          
    mov si, msg                                                                
    call print_string                                                          
    mov si, msg                                                                
    call print_string                                                          

    jmp $   ; HALT                                                                                   

; …
Run Code Online (Sandbox Code Playgroud)

x86 assembly bios osdev bootloader

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

x86指令编码如何选择操作码

cmpw %ax -5x86-64的编码指令,来自Intel-instruction-set-reference-manual时,我有两个操作码可供选择:

3D iw CMP AX, imm16 I Valid Valid Compare imm16 with AX.
83 /7 ib CMP r/m16, imm8 MI Valid Valid Compare imm8 with r/m16.
Run Code Online (Sandbox Code Playgroud)

所以会有两个编码结果:

66 3d fb ff ; this for opcode 3d
66 83 f8 fb ; this for opcode 83
Run Code Online (Sandbox Code Playgroud)

那么哪一个更好?

我在下面尝试了一些在线反汇编程序

两者都可以反汇编到原点指令.但为什么6683fb00也有效,有效663dfb.

compiler-construction assembly x86-64 disassembly

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

无法加载文件或程序集“Microsoft.SqlServer.Types,Version=12.0.0.0,Culture=neutral,PublicKeyToken=myKey”或其依赖项之一。

使用 SQL SERVER 2012 版运行 ASP.NET C# 应用程序后,我收到以下错误消息:

本地报告处理期间发生错误。报告“C:\inetpub\wwwroot\psla\Reports\PD Listing Report - Per ED.rdlc”的定义无效。报表处理中发生意外错误。无法加载文件或程序集“Microsoft.SqlServer.Types, Version=12.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91”或其依赖项之一。定位的程序集的清单定义与程序集引用不匹配。(来自 HRESULT 的异常:0x80131040)

可能是什么原因?我试过在网上搜索,并且有对 version=11.0.0.0 的引用,但没有对 version=12.0.0.0 的“Microsoft.SqlServer.Types”的引用。查看visual studio 2015的参考管理器,我只能找到版本= 11.0.0.0。

.net c# sql-server asp.net .net-assembly

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

在弹簧启动执行器中设置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
查看次数