Assembly 组装时交换

我在汇编上编写了swap,但我不确定我的代码是否正确,这就是代码 swap: mov r1, -(sp) mov (sp) r1 mov 2(sp) (sp) mov r1 2(sp) mov (sp)+, r1 rts pc 交换从堆栈接收指针sp是堆栈指针吗?通常有命令ldwra,0(rB)(0是偏移量,rB是将从中加载的地址,实际数据现在在rA中)。ldw将整个单词加载到内存中,ldb加载一个字节,stwra,0(rB)存储一个单词mov通常将一

Assembly 如何编译汇编代码?

我的一个好朋友找到并给了我一本关于英特尔80x86汇编代码的书。书中忽略的一个相当大的事实是,您应该使用什么程序来编写代码。有什么建议吗?您可以试试开源GNU汇编程序:根据您的平台,您可能对gas、yasm、nasm或masm感兴趣。大多数Linux系统在他们的包管理系统中应该有前三个,而微软宏汇编程序第四是免费的。 < P>开源代码的替代方案是扁平汇编程序< /代码>, 是一个免费的文本书,你可以考虑作为你朋友的书的伴侣。它是由大学教授卡特博士写的。它使用真实的代码并教您如何使用NASM进行编

Assembly 汇编语言:cbw

我不确定cbw命令的实际功能。我有一段代码: mov ax,0FF0h cbw idiv ah cbw后ax值如何变化?cbw指令符号将一个字节扩展为一个字。在这种情况下,它将取AL(正好是1)的符号位,并将其复制到AH的每个位 这意味着AX的两个补数值将相同,但二进制表示形式将不同 cbw指令之后的AX值将是FFF0h(一个16位-16值,就像AL最初是一个8位-16)谢谢。我理解你对AL的符号位为1的解释,因为它是负数,但我有点困惑为什么AL最初是8位-1。原来是不是AL-16(符号位等

Assembly 如何使用NASM在汇编中添加两个四字?

我在EDX中有一个四字:EAX,堆栈中还有一个四字。 如何将它们添加到一起?假设一个在EDX:EAX中,另一个在ECX:EBX中(将其从堆栈中弹出或从EBP偏移量或任何您喜欢的内容中读取)。然后,添加的内容将类似于: add eax,ebx adc edx,ecx adc指令使用低位进位,将操作数的高位相加。结果是EDX:EAX

Assembly 如何使用NASM(汇编)显示存储在dl寄存器中的值?

我对汇编相当陌生,所以请告诉我这个问题是否太模糊而无法回答,或者我是否需要包含更多信息 基本上,我在dl寄存器中存储了一些信息。eax、ebx和ecx寄存器中也存储有我想要保留的值。如何在不更改其他寄存器的值的情况下,在屏幕上显示dl寄存器 我也尝试过使用int21h,但在使用时出现了分段错误。您工作的环境将决定如何显示您试图显示的内容。int 21h中断是DOS服务,因此除非您在DOS环境中工作(例如在未加载DOS的纯BIOS环境中),否则将不可用。如果是这种情况,您应该查看-例如 至于保留其

Assembly 汇编程序Caesar密码可能与比较错误

我的凯撒密码有问题。我不打算把我的评论改成英文,但无论如何也不会太多。该程序由两个程序组成。一个是编码凯撒密码,第二个是解码凯撒密码。当我按下0时,它应该运行编码部分,当我按下1时,它应该运行解码部分 编码程序应该是这样工作的“0”->“abc”->“A”->“bcd”,而解码则是“zab” 糟糕的是,每当我按0或1时,它都会进行编码或解码。例如,如果有: cmp $'0' , %bl je LOOP1 cmp $'1' , %bl je LOOP2 程序将在0和1编码后运行。如果我将其更改

Assembly 非法内存引用

我是汇编语言的初学者 正在尝试实现STRCPY 我的汇编程序“TASM”返回“非法内存引用”错误。。并试图阅读有关错误的信息,但找不到任何内容 这是ma代码 include inout.asm .Model Small,c .486 .STACK 200h .DATA Arr1 DB "ABCD$" Arr2 DB "EFGHIJ$" .CODE StART: MOV AX, @DATA MOV DS, AX LEA Si,Arr1 LEA

Assembly 用于查找素数的MASM代码无效

我有以下查找素数的代码: isPrime PROC; checks if a number is prime by dividing out values less than it until it finds one that has a remainder of 0 ;or the test value reaches the number retest: inc testNum mov eax, testPrime cmp eax, testNum je pri

Assembly 为什么CPSR不是银行登记簿?

在ARM中,SPSR是一个存盘寄存器,即在模式每次更改后,将CPSR复制到SPSR中,在模式返回后,将SPSR复制回CPSR。为什么CPSR没有直接存入银行?似乎每次模式更改都有两条附加指令(复制到spsr,复制到cpsr)手动模式更改不是ARM的效率目标。通常,手动模式更改仅在启动或初始化时对设置堆栈等进行 cpsr是活动副本。为什么我们有银行的lr寄存器,而没有当前的pc?spsr是用于不同模式的银行cpsr;就像倾斜的lr是用于不同模式的pc。银行业务是透明的,因此异常状态可以是透明的。s

Assembly 伪指令上的PcSpim语法错误

如果我使用像li或la这样的指令,我会不断得到语法错误。如果我尝试一个没有这些指令的代码,它可以正常工作,但我需要使用它们。我尝试了不同的版本,但总是出现相同的错误(我允许使用伪指令)。我需要将其用于一个大学项目,但我无法检查我编写的代码是否正常,因为我无法运行代码。 我错过什么了吗?我不知道如何使它正常工作,我是新的组装和pcspim,所以我可能忽略了一些愚蠢的事情 更新:如果我使用PcSpim,我将无法获得任何代码。我尝试使用QtSpim和MARS测试我的代码,他们都读取了代码(尽管仍然不正

Assembly 第一次汇编程序

我在debug.exe中学习x86汇编,但我似乎完全不理解基础知识。我有一个汇编程序(由讲师编写),我必须对它进行修改,这样它就不用输入并打印,而是需要输入,然后用它做些什么,然后打印。我不知道阅读从哪里结束,打印从哪里开始,我真的很想知道在哪里插入我的代码,以及每一行做什么 a100 mov dx, 200 mov ah, 0a int 21 mov bh, 00 mov bl, byte ptr[201] mov byte ptr[200], 0d mov byte ptr[201], 0a

Assembly 在换档分割装配后舍入整数

我需要能够在移位除法后对整数进行四舍五入,并且不能使用mul或div指令 例如: eax = 745 shr eax, 3 这应该给我值93,因为它截断了余数。但是假设浮点值是749,使用shr指令仍然会给我值93,即使它通常会四舍五入到94(学校评分) 我该如何着手处理这个问题 我能用的除法和乘法就是shr/shl 被移出的部分是剩余部分。要实现正确的舍入,您只需要它的最后一位,它将保留在CF中: shr-eax,3;除以8,最后移位的位在CF中 adc-eax,0;如果CF=1,则ea

Assembly 汇编Fat32引导

经过几个小时的挣扎,我现在完全迷路了。 我试图做的基本上是将第一个根目录条目加载到内存中,但在读取部分似乎失败了。我正在使用virtualbox进行模拟 这是孔代码: [BITS 16] [ORG 0x7C00] jmp START nop OEM_ID db "APACU-OS" BytesPerSector dw 0x0200 SectorsPerCluster db 0x01 ReservedSectors dw 0x227E T

Assembly 如何打印MUL产品的输出?

我正在使用汇编中的MUL(MASM)将两个整数相乘 根据MASM指令集文档,产品存储在EDX:EAX中,即EDX和EAX寄存器的组合(如果我理解正确) 因此,我尝试先打印EDX寄存器的结果,然后再打印EAX寄存器,以打印出整数 但是当我得到一个超过32位(小数点后10位)的乘积时,我得到了一个奇怪的答案 例如100000*100000=21410065408,这是错误的。 但对于小乘法,它是有效的 以下是汇编代码: ; MULTIPLY mov eax, var1 ; var1 and

Assembly 汇编程序nasm显示所提供数字的所有除数

我必须写一个程序来显示所提供数字的所有除数。数字是从键盘读取的,存储在bufor中,但我的程序工作不好,我被卡在了黑点上。。。在运行它之后,我分段错误(内核转储)可能会有更多过期的人来帮助它。欢迎所有建议!提前谢谢 _start: ; ;*******reading from keyboard mov rax, 0 ; kyboard descriptior mov rdx, 10 ; bytes to read mov rdi,0 ; keyboard readi

Assembly 在总成中除以10,结果不正确

我试图在arm组装中实现10除法。我遵循了第一次回答问题时提到的方法 这是我的密码 MOV r2, #10 LDR r3,=0x1999999A ; 1999999A == (2^32 / 10) + 1 UMULL r9,r3,r5,r3 ;divide an integer value in r5 by 10 MOV r6, r9,LSR r2 ; r6 has the quotient 但是这段代码没有给出正确的结果。例如

Assembly 非法使用mov/xchg运营商

我在学校上汇编课程,他们问了我这个问题: 以下操作的非法使用是什么: 1. mov bh,al 2. mov dh,cx 3. mov bh,bh 4. mov cl, 4F2h 5. mov cx, 002dh 6. xchg var1, var2 使用mov和xchg的操作不合法的情况是什么?某些操作数组合合法,而某些组合不合法。最值得注意的是,两个操作数的大小必须相同,并且至少有一个操作数必须是寄存器。我认为这些事实的结合

Assembly ARM Cortex-M4,使用UART_DR和FIFO进行读/写

所以我正在学习ASM,并且有一个LM4F120XL ARM Cortex-M4 MCU。 我使用的是Keil uVision V4.54 我熟悉设置端口等,初始化GPIO和UART 我一直坚持的是阅读和写作,比如说,通过连载来阅读和写作 我理解RxFE=0,FIFO不是空的-从中读取; TxFF=0,FIFO不是全写的 但是在比较并满足这些条件之后,我实际上在向UART_DR(数据寄存器)写入什么数据呢。。?是否只是将数据寄存器加载到一个寄存器中,将该地址的值加载到另一个寄存器中,然后。。。我丢

Assembly SHLD和SHRD是如何真正工作的?

我读过英特尔的手册,但大部分都不懂。我试图通过使用两个32位寄存器将四字(64位)十进制转换为字符串 mov eax,dword[value+4] mov ecx,dword[value] shld eax,ecx,1 *;This translates to what?* ... value dq 45678910123457 我最后得到了什么?我可以用这种方式分隔数字(稍后转换为ASCII)吗?怎么做 编辑:好的,更具体地说-对于dword integer(以10为基数),我可以使用多个

Assembly MIPS32汇编语言基本存储和打印服务

我试图提示用户输入字符串、整数和字符,然后用标签将它们显示回屏幕 我让字符串正常工作,但字符和整数结果给了我垃圾。这是我的第一个汇编语言程序,我不知道为什么当我将结果保存到$t寄存器时,当我去检索它们时,会得到垃圾 任何帮助都将不胜感激 .data stringPrompt: .asciiz "Enter a string up to 25 characters: " intPrompt: .asciiz "Enter an integer: " charPromp

Assembly 程序集中的TSR保存在内存中

我有TSR的问题,试图保存在内存中,并在启动程序时继续写其他东西,并在后面继续工作秒表 代码如下: cli xor ax,ax 斧头 mov bx[es:1Ch*4] mov[old_int_off],bx mov bx[es:1Ch*4+2] mov[old_int_seg],bx 定时器 mov[es:1Ch*4],dx mov-ax,cs 移动速度[es:1Ch*4+2],最大 推送ds 流行音乐 性病 mov ax,3100h 莫夫dx,500 int 21h 当我启动程序时,我可以编写

Assembly 除两个无符号字节的汇编

我很难理解何时以及为什么要使用cbw/cwd/cdq/cqo。我有两个无符号字节bNum1和bNum2,我需要将它们分割并存储在一个字节大小的varbAns中。我意识到我需要将数据放在AX中,但不确定如何将字节放在AX中,而不会出现无效大小错误: mov ax, byte[bNum1] # invalid size error div byte[bNum2] mov byte[bAns], al 如何修复此错误?对于我在汇编方面的初步理解,我深表歉意。cbw/cwd/cdq说明用于对扩展编号

Assembly ASM&x27;sall';单参数命令?

sall指令,格式为 sall Src,Dest 转换为Src向左移动Dest Dest=Dest<<Src 我假设它的移位-8(%ebp)向左移动,但移动多少?如以下所述: 指: Multiply r/m32 by 2, once. 您的汇编器似乎不需要,1,因为它很容易推断 我只是在这里做了一个快速测试,看看这个: .globl f f: sall -8(%ebp) sall $1, -8(%ebp) 组装和拆卸: $ otool -tV exam

Assembly 如何在MIPS中设置指向asciiz字符串的指针

我试图将用户输入的asciiz字符串转换为整数。这是我目前掌握的代码。如果我硬编码一个字符串,然后使用命令la$s1,hardCodedString,它就可以完美地工作。但是,当我尝试获取用户输入时,没有打印任何内容。是不是因为la不是正确的命令 我应该如何在$s1中存储指向当前$a0中输入的asciiz字符串的指针 .data theStr: .asciiz "Enter whatever it is: \n" errorMessage1: .asciiz "Erroooor1\n" e

Assembly 为什么不是';是否从8259执行IRQ0(8253定时器中断)的ISR?

是我的操作系统的源代码 我确保当CPU从8259 PIC(可编程中断控制器)获得中断时,它总是正确地“偏移”到ISR阵列(中断服务例程)。(您可以找到完整的代码。): 尚未实现的中断处理程序用\u irq\u unhandled表示。到目前为止,我发现CPU异常和软件中断(陷阱)工作正常。例如,当我的程序试图除以零时,它会跳到\u isr0。或者,当我尝试int1、int2、int7或任何类似操作时,isrs数组(IDT;中断描述符表)中的正确ISR被索引并调用。但是现在,我无法让PIC执行我的

Assembly SetInt 9h,KbdEvent(这是什么?)???(MASM)

有人能告诉我这两行代码(DOS键盘驱动程序)在做什么吗 OldKbdEvent在代码的其他地方定义如下: OldKbdEvent DD? KbdEvent作为标签存在于代码的其他位置。这些是正在定义的这些符号的唯一实例 在这两行之后,代码向DOS发出一个中断27h(终止并保持驻留),这意味着DOS终止程序,但将其保留在内存中,以便稍后恢复程序 如果您仔细查看代码,我希望您会找到一对宏,GetInt和SetInt。在名称上,它们将获取或存储一个值到位于0000:0000的中断表中-您正在处理Int

Assembly 哪个2';如果只需要结果的低位,则可以使用s补码整数运算,而无需将输入中的高位置零?

在汇编编程中,很常见的一种情况是,需要从寄存器的低位计算某些东西,而这些低位不能保证将其他位归零。在像C这样的高级语言中,您只需将输入转换为较小的大小,然后让编译器决定是否需要将每个输入的高位分别归零,或者是否可以在事后切掉结果的高位 这在x86-64(又名AMD64)中尤其常见,原因有多种1,其中一些存在于其他ISA中 我将使用64位x86作为示例,但目的是询问/讨论一般的无符号二进制算法,因为。(注意C和C++不保证两个互补,而有符号的溢出是未定义的行为。)< /P> 作为一个例子,考虑一个

Assembly 在汇编语言中,Rd、Rn、Rm、Ra的完整形式是什么?

我们经常使用这些术语。但他们为什么这么命名还不清楚。 目的地寄存器 Rn:寄存器中用于算术运算的操作数 Rm:寄存器中用于算术运算的操作数 Ra:寄存器中用于加减运算的值。 想想“累加器” 您可以浏览一下,以查看以这种方式使用的示例。 目的地寄存器 Rn:寄存器中用于算术运算的操作数 Rm:寄存器中用于算术运算的操作数 Ra:寄存器中用于加减运算的值。 想想“累加器” 您可以浏览一下,以查看以这种方式使用的示例。

Assembly 预编码器和解码器。差别

我正在阅读Agner Fog的材料,我有一些疑问: 预解码器和解码器可以处理16字节或4条指令 每时钟周期 什么是解码器上下文中的预解码器 作者谈到了宏指令的缓存。我不知道为什么它会有用,毕竟我们有缓存指令。什么是环回缓冲区 什么是微操作融合和宏操作融合 “预解码器将查找并标记指令边界,解码任何前缀,并检查某些属性(例如分支)。”()() 一级指令缓存是宏指令的主缓存。循环缓冲区存储一小串宏指令(如32字节),这对紧密循环很有用,与从一级缓存读取相比,它节省了延迟和电源 “登记册重命名(RAT)

Assembly 递增寄存器超过其限制。汇编语言加法

执行以下行后,EAX中的值是多少 mov eax, 1002FFFFh inc ax 答案是1002000h 我的问题是,为什么答案不是1003 0000h,或者1002 0000h,考虑到我们最初从32位开始,答案是32-4位。你增加了16位的AX,并溢出到0x0000 所以答案是0x10020000(不是您所说的0x1002000,可能是打字错误) 要得到0x10030000,您必须增加EAX,而不是增加16位的AX,并溢出到0x0000 所以答案是0x10020000(不是您

Assembly 在ARM汇编中使用C函数

我见过一些人在代码中使用C库中的printf的例子,如下所示: .data .balign 4 hello: .asciz "Hello\n" .text .global main .func main main: ldr r0, hello_msg bl printf mov r7, #1 swi 0 hello_msg: .word hello .global printf 他们怎么知道r0会作为字符串arg传递给printf?我知道每当调用一个子例程时

Assembly &引用;错误A2006:未定义符号,从调用宏,主线代码;

我试图提供一个最终项目的框架,这是一个FP计算器。然而,我遇到了一些麻烦。如果我编译这段代码,我会得到。我不确定这是什么程序集,但我相信它是32位的,我正在使用MASM编译器 其要点是从输入文件中读取一行,并使其执行操作。然而,我只是在做定义部分,我的合作伙伴将找出实现操作的方法 如果我注释掉主函数,减去“Only_Nums,Character_Error:”和Invalid_Char:”程序将编译 你能帮我确定为什么它不能编译吗。我所能想到的唯一合乎逻辑的事情是,被引用的代码并不是首先定义的,

Assembly 在长模式下使用VGA绘制像素

如何在长模式下使用AT&T组件绘制像素? 我已经在实模式状态下启用了VGA模式。我的代表只有1岁,因此我无法发表评论,但如果您接受这一部分答案,您应该调查位平面。模式13很容易实现,因为它在0xA000(64000字节)下适合小于64k的内存,但当图形模式需要大于64k的内存时,VGA适配器采用了过于复杂的位平面解决方案 位平面是存储在VGA控制器内部存储器上的64k内存块,其中至少包含4个“存储组”。您需要使用相关端口的in和out指令与VGA控制器进行对话,以便告诉VGA适配器您希望映射到0

Assembly 程序集-独立标签的作用是什么?

独立标签在汇编语言中(一般)做什么。下面是8080汇编代码的摘录 标签FNDLP是否引用与FL1相同的说明 FNDNXT是否指包含第一条INX D指令的位置?而事实上,它是在它自己的行(不像FL2)只是一个风格的东西 FNDLP: ;*** FDLNP *** FL1: PUSH H ;SAVE LINE # LHLD TXTUNF

Assembly 我试图在BCD中添加两个数字。我如何用进位一点一点地将两个十六进制值相加?

我在R0和R1中加载两个十六进制值。然后,我将R2设置为我的总和应该结束的寄存器。如何一点一点地添加这些十六进制值?我试图传入两个要相加的数字以及存储结果的位置。然后将结果存储在ram中,并传回该地址,如果没有发生溢出,则传回0,如果发生溢出,则传回1 这是臂内装配 AREA mydata,DATA SUM DCD 0 AREA mycode,CODE THUMB EXPORT __main NUM1 DCD 0x275 NU

Assembly 递增地址程序集MOS6502的前两个字节

这里我遇到了一个问题,因为寄存器只有8位,我无法存储16位地址,所以我必须将其分成两个字节E: 地址:%4300将被划分为小端点 高字节:43 低字节:00 问题是我不能使用简单的INC指令增加地址的高字节,而只能增加低字节 例如: LDA $4300 ADC #01 STA %4300 编辑: 我想增加内存地址,即$4300,但我只想增加前两个字节,因此高位字节,我不想为该地址写入值 例如: LDA #$4300 ADC #1 ; the result i want should be $

Assembly 字节存储器

嘿,我是AVR系列汇编编程新手,但熟悉uC,比如PIC。我现在感到困惑的是以下一些示例代码的摘录 .dseg .org 0x0100 RegA: .byte 1 RegB: .byte 1 RegC: .byte 1 .... 对于PIC系列,您可以在定义标签后立即指定带标签寄存器的地址。然而,在AVR系列中,使用这种语法,我不确定RegC存储在哪里。据我所知,ATMega328P上的SRAM为16位宽,因此这意味着RegA和RegB存储在0x0100?因此,堆栈指针会自动递增并将RegC

Assembly QEMU寄存器和eip在ds中移动0x18后被销毁

我现在正在学习构建自己的引导加载程序。我能够设置gdt并进入保护模式。但当我试图将0x18(gdt中的第三段)移动到ds中时,我的大多数寄存器都被破坏,eip得到了一些随机信息 导致错误的代码:(im已处于受保护的32位模式) 指令前的gdb: ─── Output/messages ───────────────────────────────────────────────────────────────────────────────────── ─── Assembly ────────

Assembly 是否有用于16字节宽VTBL的Armv8-A内部版本?

根据我经常使用的消息来源, 对于具有8字节目标寄存器的查找表,只有这些(四类)内部函数(为简洁起见,省略了uint8x8和poly8x8_t变体) int8x8\u t vtbl1\u s8(int8x8\u t a,int8x8\u t b) int8x8\u t vtbl2\u s8(int8x8x2\u t a,int8x8\u t b) int8x8\u t vtbl3\u s8(int8x8x3\u t a,int8x8\u t b) int8x8\u t vtbl4\u s8(int

Assembly-在函数中传递和检索字符串指针

我正在做一个编译器(只是一个有趣的爱好项目)。我的编译器实现了一种与C非常相似的自定义语言(主要是它的可移植汇编程序),并生成我使用NASM构建的x86汇编代码。目前,我正在致力于实现将字符串传递给函数的功能,我对此感到非常困惑。具体来说,我试图传递一个字符串并将其分配给另一个字符串(函数参数)。下面是我的程序试图编译的内容: # Test passing a string func print_str(s:str) println("Your string is:") pri

Assembly x86-64从堆栈中存储和删除浮点值

所以我认为我应该制作简单的助手函数,用于在堆栈和XMM寄存器之间移动数据,但我还是在进行分段。如何正确地做到这一点?以下是我当前识别故障的代码: pushxmm0: SUB RSP, 8;Move the stack MOVSD QWORD [RSP], XMM0 RET popxmm0: MOVSD XMM0, QWORD [RSP] ADD RSP, 8;Move the stack RET main: ;Do stuff here

Assembly NASM中.data部分中变量的对齐

使用Agner Fog的objconv的输出,我看到了这条评论的两个实例: ; Note: Memory operand is misaligned. Performance penalty 这可以通过在数据声明前面加上ALIGN 16来解决,例如: section. data align=16 data_1: dq 0 data_2: dq 0 str_var: db "This is a string",0x00 ALIGN 16 MQX_Dcc: dq 0 我的数据部分以align=1

Assembly 在内存位置上调用'add'是否比在寄存器上调用它然后移动值更快?

更快的是: add DWORD PTR [rbp-0x4],1 或 我见过编译器生成的第二个代码,因此在寄存器上调用add可能要快得多?添加到寄存器可能要快得多(因为寄存器是片上的),但是,由于无论如何都必须加载和存储数据,所以不太可能看到改进 冗长的方法甚至可能更慢,因为CPU可能有机会优化较短的代码。此外,较短的代码可能具有读/修改/写的原子性,这取决于您如何编写代码。它当然不会浪费eax寄存器 总之,较长的代码不太可能有足够的改进(如果有的话)来证明其可读性 但你不必猜测(甚至不必问我们

Assembly INT 0x13驱动器初始化失败,并出现超时错误

我正在尝试开发一个引导加载程序,它只需扫描它自己的引导介质(带有FAT16的软盘)的根目录中的一个文件,然后跳转到它。我最终遇到了一个问题,我在网上找不到,我觉得我做错了什么:在我的代码开始时,当我使用INT 0x13读取驱动器的根目录时,设置了进位标志,在我让它打印出错误代码后,我得到了0x80,似乎对应于磁盘超时。我已经尝试将DL硬编码为0x00(软盘#1‒与以前相同)、0x01(软盘#2‒AH=0x01非法函数)和0x80(硬盘#1‒实际上有数据,但正如预期的那样,不是软盘映像中的数据)。

Assembly pep9汇编语言中的Fibonacci

我试图在带有索引寻址的数组中显示Fibonacci(降序)的前24个数字,但是,我得到了错误的输出 我试图将fib[I-1]存储到m,将fib[I-2]存储到n,并将它们相加,这就是我认为我出错的地方 BR main list2: .BLOCK 24 ; fibonacci(24) i: .BLOCK 2 ; iterator m: .BLOCK 1 ; fib [i-1] n: .BLOC

Assembly 如何通过x86 TSS正确设置任务切换

我正在尝试开发一个基本内核,我想让它执行一个任务切换到我从连接的磁盘加载到内存中的一些代码 我试着遵循英特尔的第7章,但我的尝试似乎都导致了三重失误 特别是,我认为分页的设置有问题。我希望切换到的任务以其自己的任意页面映射运行,因此您将在下面的代码段中看到,此任务中的虚拟地址0x0应映射到物理地址0x2000000,这也是我加载代码的位置 我尝试设置分页时,为用户和内核页表和页目录定义了函数setup\u page\u directory\u和\u page\u tables中的int数组。内核

Assembly 如何使用三个(?)操作数读取此行?

我试图理解基本知识,但到目前为止,我只能看到两个操作数的示例: ADD表示括号中的值相加并存储在中。我明白了。 但我如何理解这一点: 添加R10 0x8 R5 R5和R10表示寄存器中的地址,对吗?什么是0x8 我将尝试以下方式转移: R10+0x8+R5并将其存储在R10中。无论R5、R10和0x8是什么。几乎总是,3操作数ISA都是操作dst、src1、src2,其中dst是只写的,而不是源 e、 g.AArch64添加x1、x2、x3不销毁任何一个原始输入操作数 但对于任何给定的ISA,请

Assembly 为什么gcc和clang生成mov reg,-1

我正在使用编译器资源管理器查看gcc和clang的一些输出,以了解这些编译器为某些代码发出的程序集。最近我查看了这段代码的输出 int compare_int64(int64_t left, int64_t right) { return (left < right) ? -1 : (left > right) ? 1 : 0; } 通用条款: 我注意到这段代码的大小是17个字节,比一个漂亮的16字节多一个字节(我正在使用的另一个非C++编译器中x64的默认代码对齐方式是1

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