assembly - 减少程序集中的 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 进行编译。
我是组装和堆栈溢出的新手,所以请在否决投票之前告诉我我做错了什么。任何和所有的帮助将不胜感激。
解决方案
推荐阅读
- android - 如何通过 Android NFC 传输纯文本?
- aframe - 是否可以在 Aframe 中显示来自 javascript 变量的值
? - react-native - 需要未知模块“1”。如果您确定该模块存在,请尝试重新启动 Metro
- javascript - 用 mocha 测试 express 路由器
- javascript - 如何使用 React Hooks 重写 React Native 的 TVEventHandler?
- keycloak - 无法通过 Admin REST API 将领域角色分配给新创建的 Keycloak 用户
- django - 从我的 django 模型上的每个传感器获取最后一个值
- java - 使用 api 响应图像格式的最佳选择?
- perl - 如何根据模式在 Perl 中分隔数组
- java - 基于括号拆分字符串