集会:
[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 …
我写了一个非常基本的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)
...将第二个和第三个参数相乘,然后放入第一个参数,该参数必须是寄存器.在我生成的程序集中,第一个参数是常量!
我正在上汇编语言课程,这本书给了我一个数据类型列表:
正如标题所说,我希望获得有关每种数据类型的上限/下限的信息,也许还有一些示例。
我正在尝试为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) 我有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 上运行的可执行文件的正确方法是什么?
我正在尝试开发一个操作系统.设计是这样的:我有一个加载在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) 我正在尝试编写自己的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) 当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.
使用 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。
在我的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)
有什么想法获取更多信息吗?