首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Printf nasm故障

Printf nasm故障
EN

Stack Overflow用户
提问于 2015-11-11 00:21:12
回答 1查看 251关注 0票数 1

我在一个装配类,我需要打印一个白色字符“一堆”为我正在做的项目。我已经在这里坐了几个小时了,试图使printW函数工作,所以它被称为X次。下面的代码将打印出2“s,将初始cx更改为任意数字,不会更改代码打印的"*"s的数量。我快疯了。请有人找出代码的问题,并解释为什么它是一个问题?

代码语言:javascript
复制
printBoard:
    mov ecx,0x00010
    cmp ecx,0
    loop printWhiteRow
    ret

printWhiteRow:
    call printW


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;print a string
printW:
    push ebp                ; set up stack frame
    mov ebp,esp
    mov eax, whiteChar              ; put a from store into register
    push eax                ; value of variable a
    call printf             ; Call C function
    add esp, 8              ; pop stack 3 push times 4 bytes
    mov esp, ebp            ; takedown stack frame
    pop ebp                 ; same as "leave" op
    ret                     ; return
EN

回答 1

Stack Overflow用户

发布于 2015-11-11 00:35:27

一些问题:

  1. 您似乎不知道loop指令是如何工作的。
  2. 不知道这意味着什么:add esp, 8 ; pop stack 3 push times 4 bytes。3乘4等于12,在任何情况下,你只推了一个论点。
  3. cdecl调用约定将ecx定义为调用方保存,因此,如果要保存其值,则需要保存它。
  4. 如果您想打印一个字符,为什么不使用putchar

像这样的事情应该更好地发挥作用:

代码语言:javascript
复制
printBoard:
    mov ecx,0x00010
printWhiteRow:
    push ecx     ; save counter
    push ' '     ; char to print
    call putchar
    pop ecx      ; cleanup argument
    pop ecx      ; restore counter
    loop printWhiteRow
    ret

同样适用于printf

代码语言:javascript
复制
printBoard:
    mov ecx,0x00010
printWhiteRow:
    push ecx       ; save counter
    push whiteChar ; string to print
    call printf
    pop ecx        ; cleanup argument
    pop ecx        ; restore counter
    loop printWhiteRow
    ret
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33642172

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档