Assembly 如何使用汇编(NASM)将内核从CD-ROM加载到内存中

我正在为自己编写一个引导和内核,引导和内核都将刻录在CD-R上,并将作为CD-live使用。它不是LinuxCD Live或其他东西,完全是我自己的引导加载程序和内核。我不想使用其他booloader(即GRUB),所以请不要建议我使用它们 我的问题是: 在我的引导加载程序ASM代码中,我想从CD-ROM(而不是从硬盘或软盘)将内核和内核条目加载到RAM,并假设我们知道内核在CD-ROM上的确切位置(扇区号)。 据我所知,我必须使用int 0x13,AH=02h,它将从驱动器输入读取扇区到RAM

Assembly 寄存器间接寻址

我想知道以下两者之间是否有区别: MOV [BX] + 20, AX 及 我的推理是,对于第一种情况,我们将AX+20的值移动到地址BX 对于第二种情况,我们将AX的值移动到地址BX+20 谢谢。你对第一个案例的推理是错误的。这不是一个有效的构造(除非定义了一个宏将其转换为2条指令)。你不能在MOV的中间粘贴一个值。只能使用地址的立即偏移量(第二种情况)。某些汇编编译器允许这两种组合。 但是,调试器应该给出正确的答案 Test.asm.5: MOV [BX] + 20, AX 004552B4

Assembly 在MASM中_emit的等价物是什么

我正在尝试将一些在Visual Studio中编写的内联汇编代码移植到MASM64中。原始代码使用_emit,这是一条伪指令,在当前文本段的当前位置定义一个字节 如何在x64汇编MASM中执行相同的操作?您只需使用db,如下所示: db 10h 通常在数据段中执行此操作,除非在64位版本的MASM中发生了更改,否则它也应该在代码段中工作

Assembly 如何使用汇编(NASM)将内核从CD-ROM加载到内存中

我正在为自己编写一个引导和内核,引导和内核都将刻录在CD-R上,并将作为CD-live使用。它不是LinuxCD Live或其他东西,完全是我自己的引导加载程序和内核。我不想使用其他booloader(即GRUB),所以请不要建议我使用它们 我的问题是: 在我的引导加载程序ASM代码中,我想从CD-ROM(而不是从硬盘或软盘)将内核和内核条目加载到RAM,并假设我们知道内核在CD-ROM上的确切位置(扇区号)。 据我所知,我必须使用int 0x13,AH=02h,它将从驱动器输入读取扇区到RAM

Assembly 使用gdb从内存位置读取?

可能重复: 我知道从下面的内存位置读取: mov %esi, (%eax) 在GDB中时,我可以使用 (gdb) display *(int *)$eax 如果要从内存位置0x8(%eax)读取,我可以在GDB中使用哪个命令?我尝试使用上面的display命令的一些变体,但没有成功。如果要在任何新步骤后查看表达式,可以使用display。如果您想观看此表达式,这将非常有用。如果您只是想显示一个表达式的状态,只需使用print 例如: print $eax print *(int *)$

Assembly 在Grub2中引导自定义内核

我想用Grub2启动一个自定义内核。我使用了旧的(grub 1)多引导头: .set flags, 0x0 .set magic, 0x1badb002 .set checksum, -(magic + flags) .align 4 .long magic .long flags .long checksum ... movl %eax, magic .set flags, 0x0 .set magic, 0xe85250d6 .set magic_the_second, 0x36d7

Assembly 双字节操作系统不是我想要的

我从创建了软盘启动映像,它应该: 禁用所有中断 重新启动 然而,一旦我用bochs启动它,它会消耗100%的CPU,直到我杀死它 $ bochs -f bochsrc.txt 这是软盘映像: $ hd floppy.img 00000000 fa f4 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

Assembly x86_64程序集代码的意外行为

我目前正在编写汇编代码。 我编写了一个程序,生成以下代码。 生成的代码正是我所期望的,但当我阅读它时,我的正常行为是,汇编代码将向stdout写入无穷多个“1”(在无限循环中)。问题是,它只写入一个“1”字符,关闭时没有seg故障 那么,我到底错过了什么?我写了一些评论来帮助我理解它,但是读了又读,我不知道问题出在哪里。 我的代码中是否有我不理解的副作用 谢谢 .text .globl main main: push %rbx push %rbp mo

Assembly 使用genisoimage硬盘引导模拟

有人知道如何在genisoimage中让ISO模拟硬盘或软盘吗。请不要告诉我Windows软件,因为我使用的是Debian GNU/Linux 7.6 我试过这个: genisoimage -hard-disk-boot -boot-load-size 4 -eltorito-boot boot.bin -o boot.iso iso/ 但我得到了一个错误: -genisoimage: boot.bin has no partitions. 我怎样才能让它工作呢?显然你的boot.bin没有

Assembly 如何在程序集上随机显示单个字符?

我正在写一个汇编代码,它应该随机显示一个字符。在这段代码中,我使用函数generateradom获取随机值(使用CX:DX),并将其复制到行和列中。如您所见,我对行和列使用相同的函数。但是,不显示任何字符。我尝试更改值和变量,发现只要将变量分配给dh,字符就不会显示。变量行和列在分配给dl时可以正常工作。仅当我将数值直接指定给dh时,才会显示该字符。看来问题出在dh登记册上,但我不确定它到底出了什么问题 .model small .data row db 3 column db

Assembly 装配-更换箱

我在用AT&T的语法写作。 这个循环应该检查,如果大小写在61-7A ASCII范围内(它的意思是这个小写字母)-如果否,则将其转换为空格“” change: movb (%esi), %bh #move case temporary to bh register cmp $0x61,%bh #compare 'a' ASCII and case from bh register jge nothing #if a

Assembly 汇编语言-转换两个';s将十六进制补码到其10进制的等效值

我目前正试图找出如何正确地将2的补码十六进制转换为10进制。我们得到了一个汇编语言程序,可以对32位整数进行加法和减法运算,需要获取寄存器的值并进行转换 这是我所尝试的,然而,我的教授说我在最后的计算中犯了一个严重的错误,我不知道是什么 以下是寄存器EAX值:FFFC0888 然后我将其从2的补码十六进制转换为十六进制: FFFC0888->0003F778 最后把十六进制转换成十进制。 0003F778=(0x16^7)+(0x16^6)+(0x16^5)+(3x16^4)+(15x16^3)

Assembly 用Tasm定义汇编代码段

所以我被教授了如何使用Tasm(Turbo assembler 16位)编程的基础知识,这两行代码已经向我解释过了,但现在我不记得为什么它们是这样的: start: mov ax, data mov ds, ax 为什么我们不能使用: start: mov ds, data 我已经在谷歌和这个网站上找到了,但我找不到答案。另外,如果有错误,请纠正我的英语。谢谢。您不能这样做的原因不是TASM中的限制,而是指令集的“功能”。Intel/AMD指令集不支持将立即值移动到DS寄存器中

Assembly 有没有办法优化这个x86汇编代码?

假设在eax、ecx中给定了值。写一段代码 它计算5*eax+3*ecx+1,并将结果存储在eax中。(* 这里的意思是乘法) 我的代码: ;Initialize the values in eax and ecx mov eax,3 mov ecx,4 ;Compute 3*ecx mov ebx,eax mov eax,ecx mov edx,3 mul edx ; Compute 5*eax mov ecx,eax mov eax,ebx mov edx,5 mul edx ; Compu

Assembly 32位体系结构中的DS段寄存器

我一直在研究如何通过反汇编C代码在x86体系结构中处理浮点操作。使用的操作系统是64位linux,而代码是为32位机器编译的 以下是C源代码: #include <stdio.h> #include <float.h> int main(int argc, char *argv[]) { float a, b; float c, d; printf("%u\n",sizeof(float)); a = FLT_MAX; b =

Assembly 如果两个端口位相等、大于或小于,如何比较它们?

我正在研究一个8051汇编程序,我想知道一个命令,它可以帮助我比较两个端口位,并找出它们是否相等,因此我搜索了它,发现CJNE可能有用,并试图将它放入一个程序中,如下所示……我不确定我是否走上了正确的道路,也许Xnor命令更好,但我找不到适合它的,而且由于某种原因,我无法测试它 ORG 00H MOV R0 ,#01H MOV R1, #00H CJNE R0,#00H,LOOP LOOP: MOV C, P1.0 ANL C,P3.0 MOV P2.0,C SJMP LOO

Assembly 如何删除字符串中某个字符后的所有内容?

如何删除字符串中“?”之后的所有内容?到目前为止,我使用的代码搜索“?”。我如何从那里开始 这是我的密码 INCLUDE Irvine32.inc .data source BYTE "Is this a string? Enter y for yes, and n for no",0 .code main PROC mov edi, OFFSET source mov al, '?' ; search for ? mov ecx, LENGTHOF so

Assembly 如何在汇编中的XOR语句中指定3字节存储的大小?

在我的IA-32处理器Linux汇编程序中,我得到了两个存储器 inbuf: resb 3 outbuf: resb 4 inbuf实际上只需要3个字节,我不想浪费任何内存。现在,假设我想用零覆盖它们,如下所示: xor [inbuf], inbuf xor [outbuf], outbuf mov eax,[inbuf] ; loads value from inbuf + 1B undef xor [inbuf],ax ; word shr eax,16 ;

Assembly 编译器生成程序集的解释

我试图理解如何将简单的C代码转换成程序集MIPS int main(){ int a; a = 9; return 0; } 正在被翻译成 main: .frame $fp,16,$31 # vars= 8, regs= 1/0, args= 0, gp= 0 .mask 0x40000000,-4 .fmask 0x00000000,0 .set noreorder .set nomacro addiu $sp

Assembly 检查ax中的位数

我需要找到一种方法来检查ax寄存器中(1)上当前的位数。我想在shl或shr中使用,但我不知道应该如何确切地使用它们。这是我目前的代码: org 100h mov ax, 0xffffh ;shr ax TO DO int 16h ret 我在某个地方遇到了一个问题,右移功能可以将位向右移动。所以我可能应该通过每次尝试将16位“推”到右边,然后检查LSB1或0标志来使用它?对我来说这听起来是个好主意。移位的位进入CF(进位标志),因此一种解决方案是每次移位后,您都要检查CF=1,然后增加一

Assembly 伪寄存器Z是否加载到单个寄存器?

我很难理解下面的代码 ;assume code for start of cseg ;and stack setup .equ MAXNUM = 4 ldi ZL, 0 ldi ZH, 0 ldi r20, MAXNUM loop_generate: lpm r0, Z+ eor r0, ZL ... 首先,它的确切含义是什么?我在谷歌上搜索发现“加载Z,然后将Z增加1” 第二,如果上述是真的,Z是一个伪寄存器,这意味着Z代表两个寄存器。如何将Z加载到

Assembly 试图从软盘驱动器读取扇区时,INT 13,2挂起x86实模式

我正在为一个学校项目编写一个DOS克隆,我正在尝试使用BIOS INT 13,2从软盘驱动器(主要是FAT12文件系统的根目录,扇区19)读取一些扇区。我将参数设置正确——或者至少我认为我这样做了——然后用AH=2调用INT 0x13。然而,随后系统挂起。我不明白为什么 我使用以下代码调用中断: mov ah, 0x2 ;Read sectors function mov al, 1 ;I want to read one sector mov ch, 0 ;From tra

Assembly 汇编程序的正确模板

我刚开始组装,正在看一些由讲师共享的示例程序,例如,下面的交换2个数字的程序 ORG 0h ; This line tells the MCR to place the first instruction at add 0 ; But does this have to be the first statement? I tried writing the line ; 'num1 EQU #20h' before org, but this was throwing an error LJM

Assembly 为什么RV32I包含ADDI和XORI等指令,而不包含BLTI?

我在ISA设计方面没有经验。我一直在读第二章第21页 有人能解释为什么RISC-V有使用直接指令的算术和逻辑指令,如ADDI和XORI,但没有类似的条件分支指令,如BLTI、BEQI等 (其中BranchLessThanImmediate将寄存器与常数进行比较,如果较小,则将寄存器与分支进行比较。) 我不知情的意见是,BLTI将经常用于C中的固定长度循环,例如: for (int i = 0; i < 16; i++) { ... } for(int i=0;i

Assembly 如何生成此盒带标头的校验和?

我正在尝试为Game Boy购物车生成校验和。盒带头校验和定义为类似C的伪代码: unsigned char checksum = 0; for(unsigned char *p = 0x0134; p < 0x014D; p++) x += ~*p; 如何计算这个校验和?如果可能,有没有一种方法可以使用汇编指令执行此操作?GAS指令无法读取已发送到输出文件中的字节 如果你想计算某个东西的汇编时间,我想你可以使用a来完成,它在汇编时间表达式中使用它的arg来更新汇编程序变量,并且

Assembly 如何在Gnu Assembler中测试cpu变量

我想根据我正在组装的cpu变量,以不同的方式实现一些汇编代码。 我目前正在为ARM编译,cpu变量通过GCC的“-mcpu”选项传递。我的问题是在汇编代码中如何测试变量 我知道如何使用.cpu指令(例如.cpu cortex-m3)声明变量,但我希望根据目标内核使用不同的指令。我想我能做到。ifeq,但我无法看到在条件字段中放置什么。有人知道这一点吗?在命令行上定义宏并确保使用预处理的asm文件(.S)可能是最简单的方法。我了解了这一点,但这意味着用两种不同的方式(mcpu和a-D)表达相同的信

Assembly 为什么MIPS堆栈的基础是0x7ffffffc而不是0x8000000

为什么MIPS堆栈的基础是0x7ffffffc而不是0x8000000 如果我理解正确,堆栈指针指的是放置在堆栈上的最后一项。那么,如果是这样的话,难道这不意味着地址0x7ffffffc永远不会被使用,因为在堆栈上推送整数的传统方法是将dodecredition$sp减少到0x7ffffff8,并将推送的值放在那里?模拟器(即QtSPIM)使用堆栈指针做奇怪的事情;当堆栈指针被修改时,而不是在堆栈内存被存储到中时,它们会采取行动,例如为堆栈分配额外的内存。(因此,您可以通过在堆栈指针寄存器中放入

Assembly 组件x64_86中的scanf扫描值与预期值不同

我试着扫描两个整数的输入,第一个不正确,但第二个是 .section .rodata # Read only data section. .align 8 # Aline address to multiple of 8. format_i: .string "%d %d" .text .globl run_func .type run_func, @function run_func: mov $0

Assembly 加载字语法

如果我想从基址为$a0且偏移$t2的内存中加载一个值,为什么我不能执行以下操作: lw $s2, $a1($t2) 那么,上面的表达式的等价物是什么呢?您不能这样做,因为没有MIPS指令编码支持这样的东西。您需要自己进行添加: add $a2, $a1, $t2 lw $s2, 0($a2) lw指令编码如下所示: 1000 11ss ssst tttt iiii iiii iiii iiii 其中,ssss是源寄存器号,ttttt是目标寄存器号,iii是立即数。在使用两个寄存器生成

Assembly 从二进制可执行/C数组生成x86汇编代码

我有一个包含二进制x86_64机器代码的C数组,我需要在Linux机器上将其转换为汇编代码。我在将C数组转换为二进制可执行文件方面没有问题,但找不到将其转换为asm代码的实用程序 有什么想法吗 谢谢 您可能正在寻找反汇编程序。反汇编程序获取机器代码(来自可执行文件或对象文件),并将其转换回人类可读的汇编语言。如果这是你需要的,看看 此处未列出的一些反汇编程序: IDA Pro:显然是最强大的反汇编程序之一。可能是为了你的目的而过度杀戮 NDISAM(伴随nasm汇编程序) 您可能正在寻找反汇

Assembly 如何解释这个集合?

任何人都知道(%edx,%eax,1)?看看,它似乎就是你要找的。(%edx,%eax,1)是一个与edx+eax*1对应的操作数地址 换句话说,指令是lea,这只是一个add语句,相当于eax+=edxlea指令(加载有效地址)用于以与间接寻址相同的方式计算地址,并保存结果地址,而不是读取地址中的内容。在AT&T语法的情况下,(%edx,%eax,1)表示(%edx+%eax*1)。在这种情况下,正如Laurent G所述,它相当于添加%edx,%eax。但是,通过使用其他因子(括号前的位移和

Assembly 组件-推送和#x27;d寄存器RAX在我将其从堆栈中弹出时不相同?

我目前正在64位机器上编写一个程序集NASM,以打印给定输入的阶乘,然后返回输入。程序可以正确地打印阶乘值,但返回值不返回输入。是的,代码很糟糕,我不希望你简单地重写整件事。(这是我的家庭作业。)我只想有人解释为什么我的返回寄存器(rax)没有保留它从一开始就有的值 extern read_input extern print_int call read_input push rax ;save n mov rcx, 1 ;counter push rcx ;save counter

Assembly 直接寄存器(方括号)和索引寄存器+;堆栈段中具有2x dw的les

我对汇编非常陌生,通过理解旧的16位dos游戏(由IDA Free生成的反汇编)的反汇编来学习汇编 我在代码中读到了两件事,我想,猜猜它是做什么的。尽管如此,我并不确定我是否正确,所以我想检查一下(顺便说一句,这里只是缩短了示例代码): (一) 所以我的堆栈看起来像: ... ... 02 ds (0012) 00 ax (BAF6) <- sp 我猜寄存器现在是es=0012h和di=BAF6h,这在查看其余游戏代码时是有意义的,但由于我的堆栈看起来像BAF6 0012…,

Assembly 我可以跳出当前正在执行的函数吗?

一个来自网络的问题。我被要求输入一些足以破坏堆栈的攻击代码。在第2阶段,我需要首先更改名为global_value的全局变量的值,然后调用名为bang的函数。然而,只有当我将bang的地址推入堆栈,然后返回时,它才起作用 #codes before set the value of global_value movl $0x12345678,%eax /* 0x12345678 is the address of bang */ push %eax ret 如果我使用像这样的直

Assembly 进入32位保护模式

我正在开发一个操作系统。根据参考,我必须从16位实模式进入32位保护模式。在该步骤中,其使用指令如下: bits 32 但我的汇编程序说这是非法的,它还使用如下指令: org 0x7c00 有些教程使用[bits 32]。但我两者都用,但运气不好 我用谷歌搜索了这个,但这次它搞砸了 因此,任何指导都会有所帮助 谢谢您必须告诉CPU您想进入保护模式。你最好从这里开始,看看这个网站。简而言之:在开始时使用use16或bits 16之类的实际模式,使用lgdt[6byteGDTstruct]将有效

Assembly 64位操作码

我的问题是: 指令MOV RBX,RCX由YASM+链接编译并链接为: 48小时89小时CBh 但在其他程序中,如notepad.exe(64位),相同的MOV RBX,RCX显示为:48h 8Bh D9h 两个操作码都对吗?那边有什么错误吗?或者发生了什么? 谢谢你的阅读。谢谢你的回答。两者都是正确的 48h 89h CBh对应于REX.W+89/r,即MOV r/m64,r64 48h 8Bh D9h对应于REX.W+8B/r,即MOV r64,r/m64 由于RBX和RCX是(64位)寄存

Assembly NASM中乘以前缀的计数参数的最大大小?

使用NASM组装下面的结构,我得到以下错误: test.asm:65: error: TIMES value -228 is negative 即,值0x104被解释为负数 在NASM中,乘以前缀的count参数的最大大小是多少,如何仅使用“小”计数初始化结构 我使用NASM版本2.12.02@Windows 10。在web上的WIN32N.inc中,MAX\u PATH定义如下: ... DDD_RAW_TARGET_PATH equ 1h DDD_REMOVE_DEFINITION equ

Assembly tst.b或tst.w指令到底做什么?

我理解它应该是“测试目的地”,但这到底意味着什么? .w和.b的操作如下: dst+0FFFFh+1
dst+0FFh+1
 通常test意味着:使用按位AND组合两个值,然后根据结果设置状态寄存器,但不存储结果本身 在MSP430上,TST指令只有一个参数;在本例中,“测试值”似乎与“将值与0进行比较”相同 事实上,MSP430的一些未知编译器说: TST(.B)xxx是CMP(.B)#0,xxx的缩写 这个指令如何影响状态寄存器?他说,根据结果设置状态寄存器。我在问状态寄存器的哪一部分被设置

Assembly 组装x86 REP、REPZ、REPNZ、XACQUIRE和XRELEASE说明

正如我所注意到的,0xF3二进制前缀用作: 1) 重复并减少ecx,直到INS、OUTS、MOVS、LODS、STOS指令中的ecx等于0,并调用rep 2) 重复并减少ecx,直到ecx等于0或ZF在CMPS,SCAS指令中设置,并调用repz或repe 0xF3二进制前缀用作: 1) 重复并减少ecx,直到ecx等于0或ZF未在CMP,SCAS说明中设置,并调用repnz或repne 最近注意到XACQUIRE/XRELEASE前缀也有相同的二进制值(0xF2,0xF3) 那么XACQUIR

Assembly 如何在AVR 8位上实现内联组装?

我知道这与“愚蠢的问题”很接近,但我一直在研究如何在AVR 8位引导加载后执行机器代码,并了解到,AVR 8位MCU上使用的哈佛体系结构使得除了flash以外的任何地方都无法执行代码。那么,如何在运行时使用内联asm引入新的可执行代码呢?您混淆了三件事: 内联装配 内联汇编用于将汇编指令传递给C(或任何语言)编译器。编译器将把汇编指令添加到它生成的代码中。最后,内联汇编程序指令的存储方式与编译器生成的指令相同。如果将程序写入闪存,内嵌指令也将位于闪存中 引导加载程序 引导加载程序通常会从一些输

Assembly 是否有任何指令可以比较浮点值以检查它是否大于mips中的整数值

我尝试了许多指令来检查用户输入的浮点值是否必须小于4,但我可以找到任何指令。有人愿意帮我吗 我能找到任何指示 难怪: 许多“真正”的MIPS CPU(您5年前在WLAN路由器中发现的类型)没有浮点硬件支持 (大多数模拟器似乎都支持浮点运算,但在指令集引用中通常不提及浮点指令;这不仅适用于MIPS指令集引用,也适用于许多不同的体系结构。) 直到20世纪90年代,即使是台式电脑也没有浮点硬件支持,这是很正常的。今天,对于一些移动设备来说,这仍然是事实 此类设备必须使用整数运算执行浮点运算: 示例:通

Assembly “什么是”呢;集合式公式s32.b32“;装配

我试图从中读取一段CUDA代码,并遇到以下问题: __device__ __forceinline__ bool isNegativeZero(float a) { int ret; asm volatile("{ set.eq.s32.b32 %0, %1, %2;}\n" : "=r"(ret) : "f"(a), "r"(0x80000000)); return ret; } 我不确定汇编指令是什么,但从整个文件的上下文来看,该函数似乎不仅仅是检查浮点值是否为负

Assembly int 21h ah 02h不';因为某种原因我不能工作

我的任务是从终端(又名atoi)读取一个数字,然后将其写回终端(又名itoa) 要读取字符串,我使用int21h,ah0ah。当我在调试器中检查它时,它看起来很好。然后我的atoi和itoa看起来也不错,除了在itoa中我使用int21h,ah02h来显示一个字符,但由于某种原因它没有显示。所以我回到开头,注意到在int21h,ah0ah(读取字符串)之后立即写入int21h,ah02h(打印字符)不会产生任何结果 ; STACK SEGMENT STSEG SEGMENT PARA STACK

Assembly 为什么我们不能将A000H或更高的值移动到16位寄存器中?

我已经尝试了最基本的指令mov ax,B006H,并得到了错误消息 mov ax,0B006H 解析器很挑剔 解析器很挑剔十六进制数字必须以十进制数字开头。这就是为什么这么多十六进制常量以前导零开始 这将有助于: mov ax, 0b006h 十六进制数字必须以十进制数字开头。这就是为什么这么多十六进制常量以前导零开始 这将有助于: mov ax, 0b006h 这是10秒之前的答案。更老,但关于解析器为什么挑剔的细节稍微少一些。在您的回答中,读者需要了解为什么这里需要前导0。如果你考虑如

Assembly 用LC-3汇编语言编写绝对值函数

我正在自学一本书中的LC-3组装。其中一个练习是为绝对值函数编写汇编代码 这是我用python编写的代码: #code def ABS(x): if(x < 0): return -x return x #代码 def ABS(x): 如果(x

上一页   1   2   3   4    5   6  ... 下一页 最后一页 共 482 页