首页 > 解决方案 > 减少程序集中的 rcx 产生 0x00007fff988c63c7 而不是 x86 程序集中的 1?

问题描述

我正在尝试制作一个简单的汇编程序来打印“嘿,伙计!” 使用 C puts() 函数在屏幕上显示 3 次。我的代码如下:

; ----------------------------------------------------------------------------------------
; This is an macOS console program that writes "Hey dude!" on one line and then exits.
; It uses puts from the C library.  To assemble and run:
;
;   To compile:
;     nasm -fmacho64 Program.asm && gcc Program.o -o Program && ./Program
;
;   Line by line:
;     nasm -fmacho64 Program.asm # Generate Program.o
;     gcc Program.o -o Program   # Compile Program.o into an executable
;     ./Program                  # Execute program
;   
; ----------------------------------------------------------------------------------------

        global    _main
        extern    _puts


        section   .text
_main:    
        ; Set up stack frame
        push    rbp
        mov     rbp,    rsp
        sub     rsp,    24

        push    rbx                     ; Call stack must be aligned, 
                                        ; not doing this leads to segmentation fault

        xor     rcx,    rcx

        mov     rcx,    3                   ; Loop 3 times
While:
        cmp     rcx,    0
        je      EndLoop
        dec     rcx
RCXDEC:
        lea     rdi, [rel message]      ; First argument is address of message
        call    _puts                   ; puts(message)
        jmp     While
EndLoop:
        pop     rbx                     ; Fix up stack before returning

        xor     rax,    rax             ; Return 0
        leave
        ret

        section   .data
message:  db        "Hey dude!", 0        ; C strings need a zero byte at the end

但是,它会打印“嘿,伙计!” 无限的出现在屏幕上。使用lldb调试,我想我找到了问题的根源。在 RCXDEC 设置断点,我允许循环执行一次。读取 rcx 的值,我看到它是:

0x0000000000000002

应该是这样,因为 rcx 为 3,但减少了一次。该问题似乎发生在循环的第二次迭代中。rcx 再次递减,但 lldb 说它的值现在是

0x00007fff988c63c7  libsystem_pthread.dylib`_thread + 71

这可以解释我的问题。让代码运行更多次不会改变 rcx 的值,即使它应该递减。

我该如何解决?我想做的就是打印3次。

我的架构是 x86,如您所见,我使用 NASM 和 GCC 进行编译。

我是组装和堆栈溢出的新手,所以请在否决投票之前告诉我我做错了什么。任何和所有的帮助将不胜感激。

标签: assemblyx86nasmx86-64

解决方案


推荐阅读