【问题标题】:Print an integer NASM打印一个整数 NASM
【发布时间】:2015-01-14 19:09:26
【问题描述】:

我正在尝试从用户那里读取 3 个数字并将它们存储在一个数组中,然后我使用 NASM 中的保罗·卡特函数向它们展示这是我的代码:

%include "asm_io.inc"

SECTION .bss 

tab resb 3

SECTION .data 
msg db "Un nombre :",10 

SECTION .text 
 global main 
      main:
    mov esi,tab 
    xor ecx,ecx 
get_data:   
    mov eax,msg 
    call print_string 
    call read_int 
    mov [esi+ecx],eax   
    inc ecx 
    cmp ecx,3 
    jne get_data
    call print_nl
    xor ecx,ecx 
    mov edi,tab 
print_data: 
    mov eax,[edi+ecx]
    call print_int 
    inc ecx 
    cmp ecx,3 
    jne print_data 






    mov eax,1 ; exit code 
    int 0x80 ; call exit 

问题是不执行 print_data 循环并退出。

【问题讨论】:

  • 您只为 tab 保留了 3 个字节。如果你想要 3 个双字,你应该使用 resd 3 而不是 resb 3,并且你应该在每次迭代结束时将 ecx 增加 4 而不是 1。另外,我不知道asm_io.inc 中的函数是如何实现的,但ecx 通常是一个 caller-saved 寄存器,这意味着你不应该依赖它来保持它的值跨越函数调用。您的 msg 字符串似乎也缺少 NUL 终止符字节。
  • 我已经按照你所说的修改了程序,期望这些函数没有使用ecx 寄存器,但它仍然跳过了那个循环
  • 不能跳过循环。但也许它没有打印你想看到的结果。顺便说一句,如果没有编写它的人的 cmets,很难阅读 asm 代码。当您对代码添加更改时,请更新您问题中的代码。除此之外,您还需要描述您正在调用的函数实际执行的操作。

标签: arrays assembly nasm


【解决方案1】:

只是为了清楚。这些是你所做的改变吗?即使 ECX 寄存器不用作特定功能的输入或输出,它仍可能在内部使用。这就是 Michael 对 'ecx 通常是调用者保存的'

的意思
%include "asm_io.inc"

SECTION .bss 

tab resd 3

SECTION .data 
msg db "Un nombre :",10,0

SECTION .text 
global main 
main:
mov edi,tab 
xor ecx,ecx 
get_data:
push ecx   
mov eax,msg 
call print_string 
call read_int 
mov [edi+ecx*4],eax   
pop ecx
inc ecx 
cmp ecx,3 
jne get_data
call print_nl
mov esi,tab
xor ecx,ecx  
print_data: 
push ecx
mov eax,[esi+ecx*4]
call print_int 
pop ecx
inc ecx 
cmp ecx,3 
jne print_data 

mov eax,1 ; exit code 
int 0x80 ; call exit 

【讨论】:

  • 我已经完成了所有这些修改并尝试推送所有寄存器,即使那些女巫没有在循环中使用,但我仍然有同样的问题,顺便说一下,如果你看看 Paul Carter 文档(他的书)你会发现他在调用函数之前没有推送任何寄存器。
  • 段寄存器设置是否正确? 说“本文中的早期程序都是从图 1.6 中的简单 C 驱动程序开始的。它只是调用另一个名为 asm main 的函数。这实际上是一个用汇编编写的例程. 首先,这让C系统将程序设置为在保护模式下正确运行。所有段及其对应的段寄存器都将由C初始化。"
猜你喜欢
  • 2013-12-14
  • 2011-10-17
  • 2016-01-07
  • 2015-04-12
  • 2019-07-06
  • 2015-09-16
  • 2012-03-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多