linux nasm 程序集打印从 0 到 100 的所有数字

2024-07-03

我正在编写一个程序来打印从 0 到 100 的所有数字。我这样做的唯一原因是测试打印出多位数字。

我遇到的问题是我的程序只打印出数字 1 和 2。我不知道为什么。我的编译器编译良好,没有错误,也没有链接器错误。

这是我的代码:

SECTION .data
len EQU 32
NUL EQU 0
countlen EQU 8

SECTION .bss
counter resb countlen
strlen resb countlen

SECTION .text
GLOBAL _start
_start:
    mov BYTE[counter], 1              ; set counter to 1
    mov BYTE[strlen], 1               ; set string length counter to 1
    mov ecx, counter                  ; move the counter to ecx
    add BYTE[ecx], NUL                ; add null terminator to ecx
    mov esi, 9                        ; move 9 to esi

Length: 
    cmp [counter], esi                ; compare counter to esi
    jle Set                           ; if equal, goto set
    inc BYTE[strlen]                  ; increment the string size
    mov eax, 10                       ; move 10 to eax
    mov ebx, esi                      ; move esi to ebx
    mul ebx                           ; multiply ebx by esi
    add eax, 9                        ; add nine to the result
    mov esi, eax                      ; move the result to esi
    jmp Length                        ; jump to Length 

Set:
    mov esi, 9                        ; reset checker

Check:
    cmp BYTE[strlen], 1               ; is it one digit?
    je Single                         ; if yes, jump to single
    cmp BYTE[strlen], 3               ; is it 100?
    je Exit                           ; if yes, jump to Exit

Print:                                 ; this section deals with multi-digit numbers                                   
    cmp BYTE[ecx], NUL                ; check if end of string
    je Exit                           ; if equal goto exit 
    mov eax, 4
    mov ebx, 1
    mov edx, 1
    int 80h                           ; print number

    inc ecx                           ; point to next digit in number
    jmp Print                         ; jump to Print

Single:                                   ; this section deals with single digit numbers         add BYTE[counter], '0'            ; convert to ASCII
    mov eax, 4                       
    mov ebx, 1
    mov ecx, counter 
    mov edx, countlen 
    int 80h                           ; print the digit
    jmp Length                        ; go back

Exit:                                     ; Exit section
    mov eax, 1                        ; sys_exit
    mov ebx, 0                        ; return 0
    int 80h                           ; syscall

为什么要这样做?另外,我需要更改什么才能使其按预期工作?

提前致谢,

RileyH

UPDATE:

编辑以包含“打印”标签


这是我在标准输出上打印数字的函数。抱歉,是 AT&T 的;)

movl <your decimal here>, %eax
xor %ecx, %ecx  # the counter
movl $10, %ebx  

loop:
xor %edx, %edx
div %ebx        # isolate the last digit, remainder in edx
add $48, %dx    # '0' is 48 in ascii, result is the ascii equivalent
shl $8, %dx     # move the ascii byte to %dh
pushw %dx       # puch ascii code on the stack
inc %esp        # point to the ascii byte! (discard %dl)
inc %ecx        # count the digits
cmp $0, %eax
jnz loop

movl $4, %eax     # write()
movl $1, %ebx     # stdout
movl %ecx, %edx   # now edx holds the number of digits
movl %esp, %ecx   # load the address of string array
int $0x80         # the string array is on top of the stack

Cheers!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux nasm 程序集打印从 0 到 100 的所有数字 的相关文章

  • 如何使用recv()在C++套接字中接收超过65000字节

    我正在 Linux 中使用 C 开发客户端服务器应用程序 TCP 我想发送超过65 000同时字节 在 TCP 中 最大数据包大小为65 535仅字节 如何才能无损地发送整个字节 以下是我在服务器端的代码 Receive the messa
  • 使用 ssh 启用无密码身份验证[重复]

    这个问题在这里已经有答案了 如何使用 SSH 启用无密码身份验证 这是我在寻找 ssh 文件夹时得到的 bash 3 00 cd ssh bash 3 00 pwd home uname ssh bash 3 00 ls lt total
  • 标准库字符串新放置中的内存泄漏

    我在标准库字符串的新放置中面临内存泄漏 下面我给出了显示泄漏的代码 string string1 new string char string sizeof string new string string string1 使用dbx发现泄
  • 计算字符数组中的字符频率 - x86 Assembly

    我正在尝试计算字符串中字符的出现次数 我的代码如下 data segment DSEG text db This is a sentence 0 string textSize dw text 1 size of string 1 to a
  • 使用另一个运行 Ansible 的 Vagrant Linux VM 来配置 Vagrant Linux VM

    我知道 Ansible 在 Windows 上运行时存在问题 这就是为什么我想避免将它用于我的主机 我想配置一个在 VirtualBox 中运行的本地 Linux 虚拟机 我想知道是否有人可以告诉我是否可以使用 vagrant 在同一个机器
  • Android API 中断

    我已经在 Ubuntu 上安装了 android studio 有一个带有中断图像的 API 我也尝试过重新安装 我应该怎么做才能克服这个问题 删除它后 它不会显示在 sdk 管理器中 提前致谢 首先选择并删除Intel x86 Atom
  • 如何检测 Bash/Shell 中 GUI 的可用性?

    我正在用 NodeJS 编写一个 CLI 因为我可以使用 child process 轻松运行 bash shell 命令 所以我想知道最简单的最跨平台的方式检测 bash shell 中 GUI 的可用性 Thanks 在 macOS 上
  • Linux:“用户名”不在 sudoers 文件中。此事件将被报告[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 在 Linux 机器上登录 ssh 后 我收到以下消息 用户名 不在 sudoers 文件中 此事件将被报告 我该如何解决这个问题 我正在
  • 如何通过 * 将所有文件(包括隐藏文件)移动到父目录中

    这一定是一个很受欢迎的问题 但我找不到答案 如何通过 将所有文件 包括隐藏文件 移动到父目录 如下所示 mv path subfolder path 这会将所有文件按预期移动到父目录 但不会移动隐藏文件 怎么做 您可以在 UNIX Linu
  • 如何通过 * 将所有文件(包括隐藏文件)移动到父目录中

    这一定是一个很受欢迎的问题 但我找不到答案 如何通过 将所有文件 包括隐藏文件 移动到父目录 如下所示 mv path subfolder path 这会将所有文件按预期移动到父目录 但不会移动隐藏文件 怎么做 您可以在 UNIX Linu
  • linux nasm 程序集打印从 0 到 100 的所有数字

    我正在编写一个程序来打印从 0 到 100 的所有数字 我这样做的唯一原因是测试打印出多位数字 我遇到的问题是我的程序只打印出数字 1 和 2 我不知道为什么 我的编译器编译良好 没有错误 也没有链接器错误 这是我的代码 SECTION d
  • 无法在 Visual Studio Code 中安装扩展

    我是 Arch Linux 的用户 我的问题是无法安装扩展 我遵循了 Microsoft 页面 其中说我应该单击 ctrl P 然后写入ext install package what I m looking for 所以我就这么做了 单击
  • 了解 glibc malloc 修剪

    我目前正在开发的一些程序消耗的内存比我想象的要多得多 所以我试图了解 glibc malloc 修剪是如何工作的 我写了以下测试 include
  • 构建电子 Linux 发行版:已找到 SUID 沙箱帮助程序二进制文件,但配置不正确

    我正在为 Linux 生成电子发行版 这就是应用程序的构建方式 这就是在 packge json 中构建应用程序的方式 builderForLinx electron packager out linx64 overwrite platfo
  • Docker 容器中 GUI 应用程序的 X11 转发

    我目前正在尝试在 docker 容器中运行一些 GUI 应用程序 我一直在尝试那些杰西 弗雷泽尔 https github com jessfraz at github https github com jessfraz dockerfil
  • 在 shell 脚本中使用正则表达式

    在 Linux shell 脚本中使用正则表达式解析字符串的正确方法是什么 我编写了以下脚本来在控制台上打印我的 SO 代表curl and sed 不仅仅是因为我是rep crazy 我试图在切换到linux之前学习一些shell脚本和正
  • 单声道高分辨率计时器(在 Linux 上)

    我正在将一个以 50 毫秒轮询 用于串行通信 的 Windows C 应用程序移植到 Linux 使用 Mono 我们当前使用 ZylTimer 由 ZylSoft 提供 在每个时间间隔生成 tick 事件 但是由于该库将 pInvoke
  • 汇编语言:cbw

    我不确定是什么cbw命令确实如此 我有一段代码 mov ax 0FF0h cbw idiv ah cbw后ax的值如何变化 The cbw指令将一个字节符号扩展为一个字 在这种情况下 它将采用符号位AL 恰好是1 并将其复制到每一位AH 这
  • 这些 strace 系统调用是什么意思?

    我需要分析我正在使用 strace 的应用程序的性能 但是 我真的不知道如何解释 strace 发出的各种系统调用 其中一些示例如下 A lseek 3 1600 SEEK SET 1600 B write 3 G DATA 300 0 8
  • 在 X11 中以快速帧速率捕获 OpenGL 窗口 - 可能吗?

    我有一个大小为 800x600 的 OpenGL 应用程序在我的 Linux 机器 X11 上运行 该应用程序的内容 渲染的图像 应通过网络导出到另一台电脑 首先 我想知道是否可以以大约 30 Hz 的频率拍摄应用程序窗口的快照 将它们保存

随机推荐