Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 中断10小时不工作_Assembly_Architecture_X86_Interrupt_Interrupt Handling - Fatal编程技术网

Assembly 中断10小时不工作

Assembly 中断10小时不工作,assembly,architecture,x86,interrupt,interrupt-handling,Assembly,Architecture,X86,Interrupt,Interrupt Handling,我在下面的程序中遇到分段错误。 用于将光标设置在屏幕左上角。但是为什么我在这个程序中会出错呢? 谢谢你的回复 section .text global main main: mov ah, 2 mov bh, 1 mov dh, 0 mov dl, 0 int 10h 我认为问题在于我工作的保护模式。这是一条16位指令,我正在32位机器上尝试!我说得对吗 我在32位Linux Ubuntu发行版中运行这个程序。处理器是AMD C-60。请尝试以下操作:

我在下面的程序中遇到分段错误。
用于将光标设置在屏幕左上角。但是为什么我在这个程序中会出错呢? 谢谢你的回复

section .text
global main
main:
    mov ah, 2
    mov bh, 1
    mov dh, 0
    mov dl, 0
    int 10h
我认为问题在于我工作的保护模式。这是一条16位指令,我正在32位机器上尝试!我说得对吗

我在32位Linux Ubuntu发行版中运行这个程序。处理器是AMD C-60。

请尝试以下操作:

org 100h
section .text
global main
main:
    mov ah, 2
    mov bh, 1
    mov dh, 0
    mov dl, 0
    int 10h
请阅读:

这个ORG100H实际上告诉大会,我们的计划将在 偏移量100h。为什么这是必要的?这是因为所有正在运行的程序 带有过程控制块(PCB)。这对我来说是件好事 操作系统来管理东西,所以,我们最好不要 除非你在做高级的东西,否则不要干涉它。在那之后,我们 跳一跳,对吗?然后在跳转之后,你把所有的数据都放进去, 正确的?这就是我们应对这场混乱的方式。无条件跳跃 确保数据的空间,使其不会干扰代码。 反之亦然。通常情况下,代码会干扰 数据,它将导致挂机,蓝屏死亡等等,再次 --除非你是一个知道你在做什么的汇编专家(比如做一些自我修改代码的东西和类似的神秘技巧)


对于linux,您应该只处理系统调用,您输入的
eax
数量并跳转到它/使用
int 80h
切换到内核模式:

section .data
    hello:     db 'Hello world!',10    ; 'Hello world!' plus a linefeed character
    helloLen:  equ $-hello             ; Length of the 'Hello world!' string
                                       ; (I'll explain soon)

section .text
    global _start

_start:
    mov eax,4            ; The system call for write (sys_write)
    mov ebx,1            ; File descriptor 1 - standard output
    mov ecx,hello        ; Put the offset of hello in ecx
    mov edx,helloLen     ; helloLen is a constant, so we don't need to say
                         ;  mov edx,[helloLen] to get it's actual value
    int 80h              ; Call the kernel

    mov eax,1            ; The system call for exit (sys_exit)
    mov ebx,0            ; Exit with return code of 0 (no error)
    int 80h

BIOS中断是16位代码。您的操作系统已将CPU置于32位保护模式。硬件将允许切换回16位实模式(有跳转环),但操作系统不允许。如果是这样的话,就不会受到太多的“保护”。它被我们“保护”了,我的朋友

我认为您可能需要研究的是“vt100”终端仿真。按理说,一个“健壮”的程序会在尝试使用vt100仿真之前查阅“termcaps”文件,以确保vt100仿真可用。我的经验是,它“通常”在“桌面Linux”框中可用,所以我假设它就在那里。如果我们假设错误,最糟糕的情况(我认为)就是屏幕上的垃圾

这个例子并不完全符合您的要求。它保存当前光标位置(天知道在哪里),将光标移动到新位置,打印消息,然后返回到原始光标位置。您需要查找“主光标”命令(“ESC[h”?lookitup)。只需将其写入stdout,与“hello world”相同。您也可以获得颜色和内容

; nasm -f elf32 mygem.asm
; ld -o mygem mygem.o -melf_i386

global _start

section .data
savecursor db 1Bh, '[s'
.len equ $ - savecursor

unsavecursor db 1Bh, '[u'
.len equ $ - unsavecursor

getcursor db 1Bh, '[6n'
.len equ $ - getcursor

setcursor db 1Bh, '[10;20H'
.len equ $ - setcursor

msg db "Hello, new cursor position!"
.len equ $ - msg

section .text
_start:

mov ecx, savecursor
mov edx, savecursor.len
call write_stdout


mov ecx, setcursor
mov edx, setcursor.len
call write_stdout

mov ecx, msg
mov edx, msg.len
call write_stdout

mov ecx, unsavecursor
mov edx, unsavecursor.len
call write_stdout

exit:
mov eax, 1
xor ebx, ebx
int 80h

;------------------------
write_stdout:    
push eax
push ebx
mov eax, 4
mov ebx, 1
int 80h
pop ebx
pop eax
ret
;---------------------

我相信你是对的,但是你可能想用一些关于你的环境的更多信息来补充你的问题。对不起,我设置了更多关于我的系统的信息。这不起作用…对不起,我没有发布我的操作系统。但是我在Linux上工作,这个指令是针对Windows的.COM文件的。我明白了!但是我很好奇,因为这个指令操作不起作用!NASM不认为这是一条指令…我做错了什么?哦,这确实是针对windows的。你在使用什么编译器?NASM?把你要遵循的所有顺序都放进去…而且我认为10h在linux上不起作用,你需要用int 80h创建系统调用。你应该遵循正确的教程。祝你好运。一旦出现内核L切换到保护模式,访问BIOS通常不可能,除非通过DOS仿真器,如Dox box或DOS的虚拟PC设置。我不知道Linux有什么选项。对于Windows,您可以尝试购买一个像Visual C++ 1.52(包括MASM)或更旧的16位工具集(VC 4。x包括1.52个工具集)。。如果您只想汇编,那么masm 6.11(实际名称为ml.exe)就可以了。@rcgldr nasm会很高兴地汇编16b代码,甚至汇编到DOS.com文件中(bin输出模式),这不是nasm本身的问题(尽管当目标为32/64b ELF时它会有点抗议)。运行这样的.com是毫无意义的在linux下。所以nasm仍然是可能的选择,即使对于16b环境也是如此。但您需要16b环境(IMHO dosbox应该适用于小的事情……并且没有任何理智的人会为DOS做任何中/大的事情,对吧?特别是当他们有linux可用时。)@Ped7g-true,但Masm(ML.EXE)6.11包含了一些在其他汇编程序中找不到的功能,如.if.else.endif.while等dot指令。请看。正确的方法是使用“ncurses”库。他们让我这么说::)感谢您的响应。这是一种从保护模式切换到实模式的方式。我不测试它,但我会尝试。。。