【发布时间】:2014-03-26 03:40:40
【问题描述】:
我已经看了好几个小时了,不明白为什么在我第二次输入后,我从第一次输入中存储的字符串发生了变化。
当我像这样运行示例运行时:
请输入id:12
请输入姓名:周杰伦
当我为标准输入和输出运行这部分代码时,gdb 显示第一次读取后 id1Buf 的值为“12\n”。然后它提示输入名称,所以当我输入 jay 时,id1Buf 值由于某种原因更改为“12\njay”。想不通,如果有人能帮忙就好了。
SECTION .text ;.text section
global _start ;start section
_start: ;start
main:
;;write out
mov eax, SYSCALL_WRITE ;write function
mov ebx, STDOUT ;write value
mov ecx, id ;address of message
mov edx, lenid ;length of message
int 80h ;interrupt
;;read user input
mov eax, SYSCALL_READ ;read function
mov ebx, STDIN ;read in value
mov ecx, id1Buf ;store read value in id1Buf
mov edx, IDBUFLEN ;length of idbuf
int 80h ;interrupt
;;write out
mov eax, SYSCALL_WRITE ;write function
mov ebx, STDOUT ;write value
mov ecx, name ;address of message
mov edx, lenname ;length of message
int 80h ;interrupt
;;read user input
mov eax, SYSCALL_READ ;read function
mov ebx, STDIN ;read in value
mov ecx, name1Buf ;store read value in name1Buf
mov edx, NAMEBUFLEN ;length of namebuf
int 80h ;interrupt
mov [name1readlen], eax ;store length of name
这是其他一些代码供参考。
;;constants
%define STDIN 0 ;read function
%define STDOUT 1 ;write function
%define STDERR 2 ;error function
%define SYSCALL_EXIT 1 ;exit
%define SYSCALL_READ 3 ;read
%define SYSCALL_WRITE 4 ;write
%define IDBUFLEN 3 ;length of id buffer
%define NAMEBUFLEN 500 ;length of name buffer
;;given data
SECTION .data
id db "Please enter the id: " ;prompt for id
lenid equ $-id ;length of id prompt
name db "Please enter the name: " ;prompt for name
lenname equ $-name ;length of name
idlabel db "ID: " ;used for printing end data
lenidlabel equ $-idlabel ;length of id label
namelabel db "NAME: " ;used for printing end data
lennamelabel equ $-namelabel ;length of name label
printline db "", 10 ;new line character
;;unintialized data
SECTION .bss
id1Buf: resb IDBUFLEN ;buffer for id 1
name1Buf: resb NAMEBUFLEN ;buffer for name 1
【问题讨论】:
-
告诉我当您将 resb IDBUFLEN 更改为 4 或 5 而不是 3 时会发生什么,然后还考虑使用 null 终止存储在 id1Buf 中的字符串。
-
@alvonellos 当我更改为 4 时 id1Buf 变为 "12\n\000jay\n" 如果我为空终止它 id1Buf 变为 "12\000\000jay\n"
-
由于某种偏移条件,它们一起运行,尝试使用
equ而不是%define作为该常量并告诉我会发生什么。 -
@alvonellos 对不起,我是这个语言的新手,你把它放在 .data 部分下吗?你会怎么做
IDBUFLEN equ 2 -
你的缓冲区是连续的,你希望它做什么?