gpt4 book ai didi

assembly - 无效的操作数类型错误

转载 作者:行者123 更新时间:2023-12-02 05:15:06 25 4
gpt4 key购买 nike

NASM 给出以下错误信息:

> ipl.asm:33: error: invalid operand type

出现错误的地方:

    RESB    0x7dfe-$

代码如下:

        ORG     0x7c00

JMP entry

entry:

MOV AX,0
MOV SS,AX
MOV SP,0x7c00
MOV DS,AX
MOV ES,AX

MOV SI,msg
putloop:

MOV AL,[SI]
ADD SI,1
CMP AL,0
JE fin
MOV AH,0x0e
MOV BX,15
INT 0x10
JMP putloop
fin:

HLT
JMP fin

msg:

DB 0x0a, 0x0a
DB "hello, world"
DB 0x0a
DB 0

RESB 0x7dfe-$

DB 0x55, 0xaa

最佳答案

可能是因为 resb 的操作数必须是 critical expression .这意味着它必须在汇编程序 (a) 的第一遍中是可知的。

您可以做的是确保您只使用在第一遍中已知的值。

首先,在 0x7c00 处放置一个开始标签:

          org 0x7c00
start: jmp entry

然后更改空间预留以定义另一个标签并使用它们之间的差异来计算需要多少字节:

marker:   resb 0x1ffe-(marker-start)

它所做的是计算已经输出的字节数(marker-start,这两个值在 resb 语句之前已知)并从您的字节数中减去它想要(0x7dfe - 0x7c00 = 0x01fe)。然后它会保留那么多空间,如 list 输出所示:

0000039 00                       DB      0
000003A <res 000001C4> marker: RESB 0x01fe-(marker-start)
* warning: uninitialized space declared in .text section: zeroing
000001FE 55AA DB 0x55, 0xaa

您可以看到最后两个字节位于偏移量 0x01fe 处,给定 0x7c00 基数,实际上是所需的 0x7dfe


(a) 我认为,您的表达式被认为不可知的原因与它使用实际地址这一事实有关,而该地址不一定在第 1 遍中已知。支持这一点因为 0xffff - start 也会导致同样的错误,尽管它使用的是真实的、已经声明的标签而不是 $

通过使用类似 0xffff - (label1 - label2) 的表达式,标签本身可能未知,但它们之间的区别是。

关于assembly - 无效的操作数类型错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14785964/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com