我正在使用32位Windows 7上的NASM以汇编语言编写一个hello world程序.我的代码是:
section .text
global main ;must be declared for linker (ld)
main: ;tells linker entry point
mov edx,len ;message length
mov ecx,msg ;message to write
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
mov eax,1 ;system call number (sys_exit)
int 0x80 ;call kernel
section .data
msg db 'Hello, world!', 0xa ;our dear string
len equ $ - msg ;length of our dear string
Run Code Online (Sandbox Code Playgroud)
我把这个程序保存为hello.asm …
当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.
我是操作系统开发的新手,我很好奇我在开发自己的bootloader时遇到的问题.我的操作系统将以汇编语言编写,并将以16位实模式运行.
我知道堆栈是什么,我的印象是它向下扩展到内存中.如果我错了,请纠正我.我知道如何从软盘中将基本内核加载到内存中,我不相信这是问题所在.
我遇到的问题是我不确定在哪里放置堆栈并将内核加载到内存中.我试过像这样创建我的堆栈,我遇到了问题:
mov ax, 0x0000
mov ss, ax
mov sp, 0xFFFF
Run Code Online (Sandbox Code Playgroud)
我正在加载我的内核0x1000:0x0000.当我推送并稍后在我的函数中弹出易失性寄存器时print,我的内核只是第二次挂起call print.这是我的print功能:
print:
push ax
push bx
push cx
mov al, [si]
cmp al, 0
je p_Done
cmp al, 9
je p_Tab
mov ah, 0xE
int 0x10
cmp al, 10
je p_NewLine
p_Return:
inc si
jmp print
p_Tab:
xor cx, cx
p_Tab_Repeat:
cmp cx, 8
je p_Return
mov ah, 0xE
mov al, " " …Run Code Online (Sandbox Code Playgroud) 因此,目前我正在将屏幕缓冲区(screenbuffer db 64000 DUP(0))复制到视频内存(从 0a0000h 开始)以清除屏幕。但我想知道像这样再次设置视频模式是否更好:
mov ax, 13h
int 10h
Run Code Online (Sandbox Code Playgroud)
这似乎也清除了屏幕。
或者有没有更好的方法来清除屏幕?
在Kotlin中,在Intellij上使用gradle来运行Spring Boot的任务bootRun,我得到以下错误:
BUILD FAILED
Total time: 0.085 secs
Could not set unknown property 'addResources' for task ':bootRun'
of type org.springframework.boot.gradle.tasks.run.BootRun.
Run Code Online (Sandbox Code Playgroud)
我正在使用kotlinVersion ='1.1.4-3',springBootVersion ='2.0.0.M3'而我的bootrun任务在我的gradle.build中看起来如下所示
bootRun
{
addResources = true
}
Run Code Online (Sandbox Code Playgroud)
我的bootRun按预期工作,无需调整bootRun任务
我正在使用以下服务创建RESTFul Web服务:
@RequestMapping(value = "/test", produces = "application/json", method = RequestMethod.GET)
public ResponseEntity<List<GenericModel>> returnEmpty() {
List<GenericModel> genericModelList = new ArrayList<>();
HttpHeaders headers = new HttpHeaders();
headers.add("Content-Type", "application/json; charset=utf-8");
return responseEntity = new ResponseEntity<>(genericModelList, headers, HttpStatus.OK);
}
Run Code Online (Sandbox Code Playgroud)
当空列表返回时,我在浏览器中得到以下响应:
[]
Run Code Online (Sandbox Code Playgroud)
如何在浏览器中收到“空”响应而不是[]?有某种方法可以告诉Spring将列表大小0呈现为“空”而不是[]?
我有以下用MASM为i386处理器编写的简单程序:
TITLE BLA
.MODEL SMALL
.386
.STACK
.DATA
.CODE
MAIN PROC FAR
.STARTUP
MOV EBX,0FFFFFFFFH; (1)
MOV EAX,0EEEEEEEEH; (2)
.EXIT
MAIN ENDP
END
Run Code Online (Sandbox Code Playgroud)
我对EBX寄存器的行为感到困惑。在(1)指令之后,EBX设置为1-s:
执行(2)指令不仅会将值加载到EAX中,而且在EBX的上半部分也为零:
为什么实际上会发生?
我读过,为了根据英特尔的系统编程指南(第3卷第9.9章)暂时关闭分页,我应该先禁用中断,然后再执行其他操作。我可以使用cli轻松禁用可屏蔽中断,但是所有有关禁用NMI的手册都说
NMI中断可以通过外部电路禁用(软件必须保证在模式切换操作期间不会产生异常或中断。)
我在此OSDEV页面上找到了类似于C代码的用于禁用NMI的代码,但我不太明白它的含义。
void NMI_enable() {
outb(0x70, inb(0x70) & 0x7F);
}
void NMI_disable() {
outb(0x70, inb(0x70) | 0x80);
}
Run Code Online (Sandbox Code Playgroud)
感觉代码没有上下文并且在不知道outb和inb函数做什么的情况下是没有意义的。
我正在尝试使用 Turbo C 编译器和链接器编译一个简单的程序并将其链接到 DOS .com 文件。我尝试了我能想到的最简单的 C 程序。
void main()
{}
Run Code Online (Sandbox Code Playgroud)
Turbo C 链接器中是否有链接到 com 文件的命令行参数?
我从链接器收到的错误消息如下:
“致命:无法生成 COM 文件:入口点地址无效”
我知道 com 文件需要入口点位于 100h。Turbo C 是否有设置此地址的选项?
GGC的内联汇编可能难以正确实施且容易出错1。从更高层次的角度来看,内联汇编在内联汇编语句可能发出的指令之外必须考虑一些规则。
该Ç / C ++标准的考虑asm是定义的选项和实施。在GCC中记录了实现定义的行为,包括以下内容:
即使在使用volatile限定符时,也不要期望asm语句序列在编译后会保持完美连续。如果某些指令需要在输出中保持连续,请将它们放在单个多指令asm语句中。
基本的内联汇编或没有任何输出约束的扩展内联汇编都是隐式的volatile。该文档说,易失性不能保证连续的语句将按源代码中的顺序进行排序。该代码没有保证的顺序:
asm ("cli");
asm ("mov $'M', %%al; out %%al, $0xe9" ::: "eax");
asm ("mov $'D', %%al; out %%al, $0xe9" ::: "eax");
asm ("mov $'P', %%al; out %%al, $0xe9" ::: "eax");
asm ("sti");
Run Code Online (Sandbox Code Playgroud)
如果要使用CLI和STI关闭(然后重新打开)外部中断,并按顺序MDP向QEMU调试控制台(端口0xe9)输出一些字母,则不能保证。您可以将它们全部放在单个内联汇编语句中,也可以使用扩展的内联汇编模板将虚拟依赖项传递给每个保证顺序的语句。
为了使事情更易于管理,尤其是众所周知,OS开发人员会围绕此类代码创建方便的包装器。一些开发人员将其用作C预处理器宏。从理论上讲,这看起来很有用:
#define outb(port, value) \
asm ("out %0, %1" \
: \
: "a"((uint8_t)value), "Nd"((uint16_t)port))
#define cli() asm ("cli")
#define sti() asm …Run Code Online (Sandbox Code Playgroud)