8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

将 React JS 从 18 降级到 17 版本时出现的问题

Mark Hurd 2月前

214 0

我是一名 Unity 移动游戏开发者。由于 Google Play 计费库迁移,我将应用内购买包管理器更新至 4.12.2,并将最新的外部依赖项管理器也更新至 4.12.2。在

我是一名 Unity 移动游戏开发者。由于 Google Play 结算库迁移,我将应用内购买包管理器更新为 4.12.2,并将外部依赖项管理器也更新为最新版。在 IAPAndroidDependencies 文件中,我可以看到结算客户端 6.2.1。我没有更改任何购买脚本。在我更新了所有提交的脚本后,我仍然收到 Google Play 结算错误的错误消息。我应该怎么做才能解决这个问题?

我更新了统一的应用内购买包。我还更新了 ExternalDependencyManager

帖子版权声明 1、本帖标题:将 React JS 从 18 降级到 17 版本时出现的问题
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由Mark Hurd在本站《ubuntu》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 我在将 React Js 从 18 降级到 17 版本时遇到问题。我的服务器是带有 HestiaCP 面板的 Ubuntu 22.04。命令 npm view react version 输出:18.3.1我尝试 npm uninstall react 来卸载

    我在将 React Js 从 18 降级到 17 版本时遇到问题。我的服务器是带有 HestiaCP 面板的 Ubuntu 22.04。命令 npm view react version 输出: 18.3.1 我尝试 npm uninstall react 卸载当前版本,然后安装所需版本,但执行此命令后仍然收到: 18.3.1 我该如何解决我的问题并安装 17 版本而不是 18 版本?

    卸载当前版本。

  • K,那个安装命令看起来正确。如果你检查你的 package.json 文件,它显示的是什么版本?我认为它正在安装你想要的东西,只是

  • 您的应用程序中可能存在内存泄漏。检查您是否没有执行无法在服务器端进行垃圾回收的操作,例如错误使用插件(请参阅第二篇文章)、创建未清理的间隔等。

    以下一些文章可能会有所帮助:

    • https://medium.com/le-collectionist/solving-server-side-memory-leaks-on-nuxt-js-ecd6b16b54a0
    • https://medium.com/@oliverolmaru/memory-leak-in-ssr-nuxt-js-if-everything-else-fails-1a28e6c2e360
    • https://medium.com/@samer.kmd/revealing-memory-leaks-in-frontend-applications-nuxt-js-vue-3614334cc00c
  • 我不确定,Windows 可能以不同的方式处理内存分配。您是否从本地 ubuntu 实例上的节点检查器获得了一些结果?也许这会对问题提供更多见解。此外,您是否尝试过删除应用程序的某些功能/部分来查看问题可能出在哪里?

  • @Tim 非常常见的问题。可能是服务器/节点问题,也许可以尝试通过删除框架的某些部分来缩小范围,如上所述。或者甚至可以尝试完全不使用框架,这可能有助于缩小范围。

  • StoredObj 是一个包含 GameObjects 的列表,ObjAmount 是一个包含整数的列表,以防有帮助。public void RemoveObjInv(GameObject InvObj, int amount) { ChangeOb...

    StoredObj 是一个包含 GameObjects 的列表,ObjAmount 是一个包含整数的列表,以防有帮助。

        public void RemoveObjInv(GameObject InvObj, int amount)
        {
            ChangeObjTag InvObjScript = InvObj.GetComponent<ChangeObjTag>();
            if (InvObjScript.Stored)
            {
                ObjAmount[StoredObj.IndexOf(InvObj)] -= amount;//error happens here
                if(ObjAmount[StoredObj.IndexOf(InvObj)] <= 0)
                {
                    ObjAmount[StoredObj.IndexOf(InvObj)] = 0;
                    StoredObj.Remove(InvObj);
                    GameObject.Find(InvObj.name).SetActive(false);
                }
            }
        }
    

    如果需要的话,我将提供更多细节。

    我通过测试索引来测试这是否是外部错误,但它返回 -1,而我知道它应该返回 2,即使没有外部因素。

  • 问题是您的两个列表不同步。通过调用删除条目时, StoredObj.Remove(InvObj); 您还应该调用 ObjAmount.RemoveAt(StoredObj.IndexOf(InvObj)); ,以便两个列表始终具有相同的计数。

    更简单的方法是使用来 Dictionary<GameObject, int>(); 跟踪数量。

  • 事实证明我只是在列表中输入了错误的对象,我添加了该对象的克隆,所以这只是我自己的错误。

  • A.L 2月前 0 只看Ta
    引用 10

    当您返回 -1 作为索引时,这意味着 InvObj 不在您的列表中。您必须检查两件事。首先,我不明白这部分(ObjAmount[StoredObj])您的列表是列表数组吗?还是列表列表?如果 ObjAmount[StoredObj] 是您的列表,那么,,,
    第二:检查您是否已将其添加到列表中。

    您可以打印, ObjAmount[StoredObj].count 这样您就可以知道对象是否被添加到列表中。

  • 在使用 ArangoDB3 几年都没有问题之后,突然,我遇到了 AQL IO 错误,形式为 [HTTP 500][ERR 1305] AQL: IO 错误:打开文件进行随机读取时:/ssd1/ara...

    在使用 ArangoDB3 几年都没有出现任何问题后,突然,我遇到了以下形式的 AQL IO 错误

    [HTTP 500][ERR 1305] AQL: IO error: While open a file for random read: /ssd1/arangodb3/engine-rocksdb/22850496.sst: No file descriptors available (while finalizing)

    这是在执行表单插入时

    insert { id: "foo", junk: [ 1, 2, 3 ] } in bar

    在运行填充新数据库的漫长操作之后发生了这种情况。

    查看 syslog ,我看到以下内容(为方便阅读,省略了时间戳等):

    ERROR [fae2c] {rocksdb} RocksDB encountered a background error during a compaction operation: IO error: While open a file for random read: /ssd1/arangodb3/engine-rocksdb/22850496.sst: No file descriptors available; The database will be put in read-only mode, and subsequent write errors are likely. It is advised to shut down this instance, resolve the error offline and then restart it.
    ERROR [be9ea] {rocksdb} rocksdb: [db/db_impl/db_impl_compaction_flush.cc:2922] Waiting after background compaction error: IO error: While open a file for random read: /ssd1/arangodb3/engine-rocksdb/22850496.sst: No file descriptors available, Accumulated background error counts: 1
    WARNING [afa17] {engines} could not sync metadata for collection 'OpenAlex_20240502/works'
    WARNING [a3d0c] {engines} background settings sync failed: IO error: While open a file for random read: /ssd1/arangodb3/engine-rocksdb/22850496.sst: No file descriptors available
    WARNING [afa17] {engines} could not sync metadata for collection 'OpenAlex_20240502/publishers'
    

    上面的第一条消息似乎暗示了一些事情,但我不确定是什么。

    有问题的文件 /ssd1/arangodb3/engine-rocksdb/22850496.sst 不存在,这显然是问题的根源,但我不确定如何解决它。

    重新启动 Arango DB 和系统也无法解决问题。

    文件系统上有足够的空间

    /dev/nvme0n1p1 7.3T 4.6T 2.8T 63% /ssd1

    所以这不是问题。

    arangodb --version 报告

    Arango DB Version 0.18.2, build 3518b68, Go go1.21.5

    arangosh --version 报告

    3.11.8
    
    architecture: 64bit
    arm: false
    asan: false
    assertions: false
    avx: true
    avx2: false
    boost-version: 1.78.0
    build-date: 2024-02-22 14:43:37
    build-repository: refs/tags/v3.11.8 eb715d099fb
    compiler: gcc [11.2.1 20220219]
    coverage: false
    cplusplus: 202002
    curl-version: none
    debug: false
    endianness: little
    failure-tests: false
    fd-client-event-handler: poll
    fd-setsize: 1024
    full-version-string: ArangoDB 3.11.8 [linux] 64bit, using jemalloc, build refs/tags/v3.11.8 eb715d099fb, VPack 0.2.1, RocksDB 7.2.0, ICU 64.2, V8 7.9.317, OpenSSL 3.0.13 30 Jan 2024
    icu-version: 64.2
    ipo: true
    iresearch-version: 1.3.0.0
    jemalloc: true
    libunwind: true
    license: community
    maintainer-mode: false
    memory-profiler: true
    ndebug: true
    openssl-version-compile-time: OpenSSL 3.0.13 30 Jan 2024
    openssl-version-run-time: OpenSSL 3.0.13 30 Jan 2024
    optimization-flags: -mfxsr -mmmx -msse -msse2 -mcx16 -msahf -mpopcnt -msse3 -msse4.1 -msse4.2 -mssse3 -mpclmul -mavx -mxsave
    pic: 2
    pie: 2
    platform: linux
    reactor-type: epoll
    replication2-enabled: false
    rocksdb-version: 7.2.0
    server-version: 3.11.8
    sizeof int: 4
    sizeof long: 8
    sizeof void*: 8
    sse42: true
    tsan: false
    unaligned-access: true
    v8-version: 7.9.317
    vpack-version: 0.2.1
    zlib-version: 1.2.13
    

    我正在运行 Ubuntu 23.10

    Linux servername 6.5.0-28-generic #29-Ubuntu SMP PREEMPT_DYNAMIC Thu Mar 28 23:46:48 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux

    我尝试重新安装 Arango DB,但无济于事。我已从检查点重新启动应用程序,但它现在立即且持续失败。即使像上面一样简单的插入也会引发相同的错误。

    该应用程序是用 Python 编写的,是多线程的,使用 multiprocessing 模块,并且有 64 个线程/进程全部执行上传操作。

    我在另一个系统上运行着相同的代码,并且它顺利地运行完成,所以我很困惑这里可能出了什么问题。

  • 问题是它返回的是,即使我知道它在列表中,我也将 ObjAmount[StoredObj] 放在哪里了脚本中

  • 我很好奇这个问题被否决的原因。如果我以某种方式违反了协议,我希望得到解释。我相信这个问题适合这个论坛,因为我看到了其他与 ArangoDB 相关的问题。如果不是,请给我一个更好的答案。我看了数据库论坛,但上面说这是给管理员的,不是给用户的。也许我错了。如果是这样,请纠正我,我会把问题移到那里。如果你认为这是一个愚蠢的问题,那么请告诉我为什么,我会再次尝试问一个更好的问题。

  • \'没有可用的文件描述符\' 是重点。系统对所有程序可以打开的文件描述符数量有限制,通常为 1024。请参阅

  • towc 2月前 0 只看Ta
    引用 15

    @JohnKugelman:这也是我第一次遇到这种情况,但我不确定在重新启动 ArangoDB 或重新启动系统后这种情况会如何持续。除此之外,系统相对安静——这是我的桌面工作站,运行着各种应用程序——网络浏览器、文本编辑器等。我最近确实将 Arango 从 3.10 更新到了 3.11。也许问题就在这里???

  • 引用 16

    首先,我要说的是,我设法通过删除几个相当大但未使用的数据库并从头开始重新运行应用程序来让应用程序运行。 成功了! 不过,正如我下面指出的那样,这更多的是运气而不是智慧。

    正如评论者所指出的,我相信文件描述符限制是罪魁祸首——但是,就像灯柱下的醉汉一样,我在光线好的地方寻找钥匙,而不是在实际掉落钥匙的地方寻找钥匙。

    今天早上我终于仔细查看了 ArangoDB 启动文件,其中 /lib/systemd/system/arangodb3.service 揭示了以下内容:

    # system limits
    LimitNOFILE=131072
    LimitNPROC=131072
    TasksMax=131072
    

    在我昏暗的小脑袋里 产生了一点 啊哈!

    这让我查看了在删除多余的数据库之前保存的备份:

    myobfuscatedhost:/ssd1/arangodb3/engine-rocksdb# ls -1 | grep sst | wc -l
    130878
    

    你瞧,这些数字相当接近。

    看起来,通过使用 lsof 它,目录中的每个文件确实 engine-rocksdb 都是打开的。

    因此,提高上述限制应该可以解决问题。

    我说 应该, 因为我还没有完全检验我的假设,因为正如我在开头段落中提到的那样,我通过删除多余的数据集并留下足够的空间来完成手头的任务,暂时解决了这个问题。

    我会增加限制 /lib/systemd/system/arangodb3.service ,祈祷并希望获得最好的结果。

    感谢所有最终把答案灌输到我头脑中的人。

  • 我尝试在我的 Linux 电脑上复制我必须在 Windows 电脑上学习的组装工作区(其中我有关于如何安装和使用 wsl 的说明),但是当我尝试使用./assembly 进行组装时……

    我尝试在我的 Linux 电脑上复制我必须在 Windows 电脑上学习的组装工作区(在那里我有关于如何安装和使用 WSL 的说明),但当我尝试使用

    ./assemble.ps1 ./file.s
    

    我收到以下两个警告:

    /usr/bin/ld: /tmp/cco4Rb1Y.o: warning: relocation in read-only section `.text'
    /usr/bin/ld:, warning: creating DT_TEXTREL in a PIE
    

    我尝试组装的代码是一个简单的测试代码:

    .include "./files/utility.s"
    
    .data
    msg: .ascii "Ok /r"
    
    .text
    _main: nop
        lea msg, %ebx
        call outline
        ret
    
    

    实用文件对于我们的学生目标很有用,我认为没有什么能影响问题。

    我读了一些关于使用 rip 引用(或 eip 在我的情况下是 32 位)进行寻址的内容,但没有用

    assemble.ps1 文件是

    param (
        [string][Parameter(Mandatory=$true)]$sourcePath,
        [switch][Alias('f')]$force = $false
    )
    
    $isPathValid = Test-Path -PathType Leaf $sourcePath
    if(-not $isPathValid) {
        Write-Host 'Path invalid';
        exit
    }
    
    $fileHeader = file $sourcePath;
    $isExecutable = $fileHeader -like "*ELF 32-bit*";
    if($isExecutable) {
        if(-not $force) {
            Write-Host 'The file is an executable';
            exit
        }
        else {
            Write-Host 'The file is an executable';
        }
    }
    
    $sourceFile = Get-ChildItem $sourcePath;
    
    $dir = $sourceFile.Directory;
    $name = $sourceFile.BaseName;
    
    gcc -m32 -o "$dir/$name" '-Wa,-a' '-Wa,--defsym,LINUX=1' > "$dir/$name.lst" -g ./files/main.c $sourceFile
    if($LASTEXITCODE -ne 0) {
        Write-Host "Assembler error"
    }
    

    utility.s 文件是:

    #.nolist
    
    #------------------------------------------------------------------------------
    
    .ifdef DOS
    
    .TEXT
    
    inchar: 
            PUSH %EBX
    inchar_loop:
            MOV  %AX,%BX 
            MOV  $0x07,%AH 
            INT  $0x21
            MOV  %BH,%AH
            
            CMP  $0x0A, %AL         # ignore LF, for input redirection with CRLF files.
            JE   inchar_loop        # redirection with LF files is not supported
            
            POP  %EBX
            RET
    
    .endif
    
    .ifdef LINUX
    
    .DATA
    ic_tmp: .byte 0                 
    
    .TEXT
    inchar:  PUSH %EBX
             PUSH %ECX
             PUSH %EDX
    inchar_loop:
             PUSH %EAX
             MOV $3,%EAX            # sys_read
             MOV $0,%EBX            # fd of stdin
             LEA ic_tmp,%ECX        # address of buffer
             MOV $1,%EDX            # read 1 character
             INT $0x80
             POP %EAX
             MOV ic_tmp,%AL
    
             CMP $0x0D, %AL         # ignore CR, for input redirection with CRLF files
             JE inchar_loop         # redirection with LF files is supported
    
             CMP $0x0A, %AL         # convert LF to CR, to have the same ENTER behavior as DOS
             JNE inchar_next
             MOV $0x0D, %AL
    
    inchar_next:
             CMP $0x7F, %AL         # convert delete (0x7f) to backspace (0x08)
             JNE inchar_fine        # because Linus decided that the backspace key should send a delete command...
             MOV $0x08, %AL
    
    inchar_fine:
             POP %EDX
             POP %ECX
             POP %EBX
             RET
    
    .endif
    
    #------------------------------------------------------------------------------
    
    .ifdef DOS
    
    .TEXT
    outchar: PUSH %EAX
             PUSH %EDX
             MOV $0x02,%AH
             MOV %AL,%DL
             INT $0x21
             POP %EDX
             POP %EAX
             RET
             
    .endif
    
    .ifdef LINUX
    
    .DATA
    oc_tmp: .ASCII  "0"
    
    .TEXT
    outchar: PUSH %EAX
             PUSH %EBX
             PUSH %ECX
             PUSH %EDX
    
             MOV %al,oc_tmp
             MOV $4,%EAX       # sys_write
             MOV $1,%EBX       # fd of stdout
             LEA oc_tmp,%ECX   # address of buffer
             MOV $1,%EDX       # write 1 character
             INT $0x80
    
             POP %EDX
             POP %ECX
             POP %EBX
             POP %EAX
             RET
    
    .endif
    
    //------------------------------------------------------------------------------
    //------------------------------------------------------------------------------
    //------------------------------------------------------------------------------
    
    .TEXT
    inbyte:  PUSH %EBX
             MOV  %AH,%BH
             CALL inhexchar
             CALL outchar
             MOV  %AL,%AH
             CALL inhexchar
             CALL outchar
             CALL HA2B8
             MOV  %BH,%AH
             POP  %EBX
             RET
    //------------------------------------------------------------------------------
    .TEXT
    inword:  CALL inbyte
             MOV  %AL,%AH
             CALL inbyte
             RET
    //------------------------------------------------------------------------------
    .TEXT
    inlong:
    indword:  CALL inword
             SHL  $16,%EAX
             CALL inword
             RET
    //------------------------------------------------------------------------------
    .TEXT
    outbyte: PUSH %EAX
             CALL B8HA2
             XCHG %AL,%AH
             CALL outchar
             XCHG %AL,%AH
             CALL outchar
             POP  %EAX
             RET
    //------------------------------------------------------------------------------
    .TEXT
    outword: XCHG %AL,%AH
             CALL outbyte
             XCHG %AL,%AH
             CALL outbyte
             RET
    //------------------------------------------------------------------------------
    .TEXT
    outlong:
    outdword: ROL  $16, %EAX
                  CALL outword
                  ROL  $16,%EAX
                  CALL outword
                  RET
    
    //------------------------------------------------------------------------------//------------------------------------------------------------------------------#------------------------------------------------------------------------------
    .TEXT
    newline: PUSH  %EAX
             MOV   $0x0D,%AL
             CALL  outchar
             MOV   $0x0A,%AL
             CALL  outchar
             POP   %EAX
             RET
    #------------------------------------------------------------------------------
    .DATA
    L247513: .ASCII  "Checkpoint number "
    L247003: .ASCII  "x. Press any key to continue"
    L247893: .FILL 1,4
    
    .TEXT
    pause :  NOP
    pause0:  MOVB $0x30,L247003
             JMP L271893     
    pause1:  MOVB $0x31,L247003
             JMP L271893     
    pause2:  MOVB $0x32,L247003
             JMP L271893     
    pause3:  MOVB $0x33,L247003
             JMP L271893     
    pause4:  MOVB $0x34,L247003
             JMP L271893     
    pause5:  MOVB $0x35,L247003
             JMP L271893     
    pause6:  MOVB $0x36,L247003
             JMP L271893
    pause7:  MOVB $0x37,L247003
             JMP L271893     
    pause8:  MOVB $0x38,L247003
             JMP L271893     
    pause9:  MOVB $0x39,L247003
             JMP L271893     
    L271893: PUSH %EAX
             PUSH %ECX  
             PUSH %ESI
             CALL newline
             MOV  $L247513,%ESI
             MOV  $(L247893-L247513),%CX
    L247527: MOV  (%ESI),%AL
             CALL outchar
             INC  %ESI
             DEC  %CX
             JNZ  L247527
             CALL newline
             CALL inchar
             POP  %ESI
             POP  %ECX
             POP  %EAX
             RET
    
    #---------------------------------------------------------------------------
    .TEXT
    inline:  CMP     $2,%CX
             JB      L409ABB  # salta a fine
             CMP     $80,%CX
             JA      L409ABB  # salta a fine
    
             PUSH    %EAX
             PUSH    %EBX
             PUSH    %ECX
             PUSH    %EDX
    
             MOV     %CX, %DX   # salva numero caratteri iniziale
                 
    L4004C:  CMP     $2, %CX      #ciclo
             JE      L40093       #salta a quasi fine
             CALL    inchar    
             CMP     $0x0D,%AL
             JE      L40093      # salta a quasi fine 
                
             CMP     $0x08,%AL   
             JE      L67193      #salta a elimina carattere
                 
    L50193:  CALL    outchar
             MOV     %AL,(%EBX)
             INC     %EBX
             DEC     %CX
             JMP     L4004C      #torna in ciclo
    
    #elimina carattere
    L67193:  CMP     %CX, %DX    #impedisce di cancellare oltre l'inizio del buffer
             JE      L4004C      
             DEC     %EBX        
             INC     %CX
             MOV     $0x08, %AL
             CALL    outchar
             MOV     $0x20, %AL
             CALL    outchar 
             MOV     $0x08, %AL
             CALL    outchar
             JMP     L4004C
                     
    L40093:  MOV     $0x0D,%AL   #quasi fine
             CALL    outchar
             MOV     %AL,(%EBX)
             INC     %EBX
             MOV     $0x0A,%AL
             CALL    outchar
             MOV     %AL,(%EBX)
             POP     %EDX
             POP     %ECX
             POP     %EBX
             POP     %EAX
    L409ABB: RET
    #------------------------------------------------------------------------------
    
    .TEXT
    outline: PUSH %EAX
             PUSH %EBX
             PUSH %ECX
             MOV $80,%CX
    L4001B:  MOV  (%EBX),%AL
             CMP  $0x0D,%AL
             JZ   L4002A
             DEC %CX
             JZ   L4002A
             CALL outchar
             INC  %EBX
             JMP  L4001B
    L4002A:  CALL newline
             POP  %ECX
             POP  %EBX
             POP  %EAX
             RET
    #------------------------------------------------------------------------------
    
    .TEXT
    outmess:   PUSH   %EAX
           PUSH   %EBX
           PUSH   %ECX
    L087509:   CMP    $0,%CX
           JE     L087508
           MOV    (%EBX),%AL
           CALL   outchar
           INC    %EBX
           DEC    %CX
           JMP    L087509
    L087508:   POP    %ECX
           POP    %EBX
           POP    %EAX
           RET
    #------------------------------------------------------------------------------
    
    .TEXT
    inhexchar: CALL  inchar
                CMP   $'0',%AL
                JB    inhexchar
                CMP   $'F',%AL
                JA    inhexchar
                CMP   $'9',%AL
                JBE   L3A89B3
                CMP   $'A',%AL
                JB    inhexchar
    L3A89B3:    RET
    #------------------------------------------------------------------------------
    .TEXT
    B4HA1:    AND    $0x0F,%AL
              CMP    $9,%AL
              JA     L3ACD37
    L3ACD30:  ADD    $0x30,%AL
              RET
    L3ACD37: ADD    $0x37,%AL
              RET
    #------------------------------------------------------------------------------
    .TEXT
    B8HA2: PUSH    %ECX
           MOV     %AL,%CH
           SHR     $4,%AL
           CALL    B4HA1
           MOV     %AL,%AH
           MOV     %CH,%AL
           CALL    B4HA1
           POP     %ECX
           RET
    #------------------------------------------------------------------------------
    HA1B4:    CMP     $'9',%AL
              JA      L3KCD37
    sub_0x30: SUB     $0x30,%AL
              RET
    L3KCD37:  SUB     $0x37,%AL
              RET
    #------------------------------------------------------------------------------
    .TEXT
    HA2B8:   PUSH  %ECX
             MOV   %AL,%CH
             MOV   %AH,%AL
             CALL  HA1B4
             MOV   %AL,%AH
             ROL   $4,%AH 
             MOV   %CH,%AL
             CALL  HA1B4
             OR    %AH,%AL 
             POP   %ECX
             RET
    #------------------------------------------------------------------------------
    outdecimal_byte:
    outdecimal_tiny:  PUSH %EAX  
                      AND  $0x000000FF,%EAX 
                      CALL outdecimal_long 
                      POP  %EAX 
                      RET 
    #------------------------------------------------------------------------------
    outdecimal_word:
    outdecimal_short:  PUSH %EAX  
                      AND  $0x0000FFFF,%EAX 
                      CALL outdecimal_long 
                      POP  %EAX 
                      RET 
    #-----------------------------------------------------------
    .DATA
    resti_cifre:      .fill 11,1
    
    .TEXT
    outdecimal_long:  PUSH  %EAX
          PUSH  %EBX
                      PUSH  %ECX
                      PUSH  %EDX
                      PUSH  %ESI
                      PUSH  %EDI
        PUSH  %EBP
    
                      MOV   $10,%ECX
                      CMP   $999999999,%EAX
                      JA    long_L4013K
                      DEC   %ECX
                      CMP   $99999999,%EAX
                      JA    long_L4013K
                      DEC   %ECX
                      CMP   $9999999,%EAX
                      JA    long_L4013K
                      DEC   %ECX
                      CMP   $999999,%EAX
                      JA    long_L4013K
                      DEC   %ECX
                      CMP   $99999,%EAX
                      JA    long_L4013K
                      DEC   %ECX
                      CMP   $9999,%EAX
                      JA    long_L4013K
                      DEC   %ECX
                      CMP   $999,%EAX
                      JA    long_L4013K
                      DEC   %ECX
                      CMP   $99,%EAX
                      JA    long_L4013K
                      DEC   %ECX
                      CMP   $9,%EAX
                      JA    long_L4013K
                      DEC   %ECX
    
    long_L4013K:      LEA   resti_cifre,%EDI
                      MOV   %ECX, %EBP
                      ADD   %ECX,%EDI      # EDI punta sotto alla cifra da inserire per prima
                      DEC   %EDI           # EDI torna a puntare alla prima cifra da inserire
    ciclolongL4013K:  MOV   $0,%EDX        # costruzione del dividendo EDX:EAX
                      MOV   $10,%ESI       # divisore in ESI
                      DIVL  %ESI   
                      AND   $0x0000000F,%EDX # sistemazione del resto_cifra codificato ASCII
                      ADD   $0x30,%DL
                      MOV   %DL,(%EDI) 
    
                      DEC   %EDI   
                      DEC   %ECX
                      CMP   $0,%ECX        # Controllo fine ciclo
                      JNE   ciclolongL4013K
    
                      LEA   resti_cifre,%EBX
                      MOV   %EBP, %ECX
                      CALL  outmess  
    
                      POP   %EBP
                      POP   %EDI
                      POP   %ESI
                      POP   %EDX
                      POP   %ECX
                      POP   %EBX
                      POP   %EAX
                      RET
    #------------------------------------------------------------------------------
    
    .TEXT
    indecimal_byte:
    indecimal_tiny:   MOVB  $3,num_cifre_1eWK7
                      PUSH %EBX
                      PUSH %EAX
                      CALL converti_1eWK6
                      MOV  %AL,%BL
                      POP  %EAX
                      MOV  %BL,%AL
                      POP  %EBX
                      RET
    
    indecimal_word:
    indecimal_short:   MOVB  $5,num_cifre_1eWK7
                      PUSH %EBX
                      PUSH %EAX
                      CALL converti_1eWK6
                      MOV  %AX,%BX
                      POP  %EAX
                      MOV  %BX,%AX
                      POP  %EBX
                      RET
    
    indecimal_long:   MOVB  $10,num_cifre_1eWK7
                      CALL  converti_1eWK6
                      RET
    
    #------------------------------------------------------------------------------
    # Converta da decimale a binario in EAX
    
    .DATA
    prodotti_parziali_1eWK7:   .fill 1,4
    num_cifre_1eWK7:            .fill 1,1
    
    .TEXT   
    converti_1eWK6:    NOP
            PUSH %EDX
    P_di_0_1eWK7:    MOVL  $0, prodotti_parziali_1eWK7
                     
    ciclo_1eWK7:  CMPB  $0x00,num_cifre_1eWK7     # termina se cifre finite
                          JE    fine_1eWK7
    new_cifra_1eWK7:   CALL  inchar                    # prelievo eventuale nuova cifra
                          CMP   $0x0D,%AL                 # termina se ritorno carrello
                          JE    fine_1eWK7 
                       
                          CMP   $'0',%AL                  # scarta cifre non decimali
                          JB    new_cifra_1eWK7
                          CMP   $'9',%AL
                          JA    new_cifra_1eWK7
                          CALL  outchar
    
                          PUSH  %EAX                      # nuovo prodotto parziale
                          MOV   $10,%EAX
                          MULL  prodotti_parziali_1eWK7    
                          MOV   %EAX,prodotti_parziali_1eWK7
                          POP   %EAX          
                          AND   $0x0000000F,%EAX
                          ADDL  %EAX, prodotti_parziali_1eWK7
    
                          DECB  num_cifre_1eWK7                  
                          JNE   ciclo_1eWK7                        
                      
    fine_1eWK7:           MOV   prodotti_parziali_1eWK7,%EAX 
                          POP %EDX
                          RET
    #-------------------------------------------------------------------------
    .DATA
    LZ647513: .BYTE   0x0A,0x0D,0x0A,0x0D
              .ASCII  "Press Q to exit . . . "
    LZ567893: .BYTE
    
    .TEXT
    exit:          MOV  $LZ647513,%ESI
                   MOV  $(LZ567893-LZ647513),%CX
    LZ247AA7:      MOV  (%ESI),%AL
                   CALL outchar
                   INC  %ESI
                   DEC  %CX
                   JNZ  LZ247AA7
    waitQ_LZc247A: CALL inchar
                   CMP  $'Q',%AL
                   JNE  waitQ_LZc247A
    
    .ifdef DOS
                   MOV $0x4C,%AH
                   INT $0x21
    .endif
    
    .ifdef LINUX    
                   MOV $0x0001,%AX
                   INT $0x80
    .endif
    
    #----------------------------------------------------------------------------- 
    
    .global _main
    
  • HMR 2月前 0 只看Ta
    引用 18

    最简单的方法是禁用 PIE。否则,是的,您将需要使用位置无关寻址,通常的技巧是调用辅助函数来获取返回地址,然后从那里引用所有内容。

  • 由于 32 位本身不支持 EIP 相对寻址,因此您必须手动执行此操作。通常的方法是编写一个函数,从堆栈中获取返回地址,然后将其用作固定参考点。如下所示:

    _main: nop
        call geteip
    eip:
        add $msg - eip, %ebx
        call outline
        ret
    
    geteip:
        mov (%esp), %ebx
        ret
    

    当然,如果您不需要 PIE,您可以使用链接器选项禁用它(可能 -no-pie ),然后您可以保留您的重定位。

  • 我尝试了你的代码,但是它给出了同样的错误,我也尝试了链接器选项 -no-pie,但是它显示 \'assemble.ps1:找不到与参数名称‘no-pie’匹配的参数。\'

返回
作者最近主题: