मैंने एक साधारण अनुमान लगाने वाला गेम गेम बनाने का निर्णय लिया है जो लिनक्स सिस्टम कॉल का उपयोग करता है, और कुछ सी फ़ंक्शन एक अधिक सरल इंटरफ़ेस प्रदान करने के लिए। मुझे एक सेगमेंटेशन गलती मिलती है जब मैं int को स्ट्रिंग में परिवर्तित करता हूं और सही उत्तर स्क्रीन को प्रिंट करता हूं।NASM अनुमान संख्या गेम गॉन गलत
Enter A Number One Through Ten:" :
3
Response did not match! The Answer Is:Segmentation fault
यहाँ सी कोड है::
// print.c
#include "/usr/include/stdio.h"
#include "/usr/include/string.h"
#include "/usr/include/stdlib.h"
#include "/usr/include/time.h"
void print(const char* msg)
{
printf(msg);
return;
}
int compare(const char* str, const char* str2)
{
int i = strcmp(str, str2);
if (i == 0)
{
return 1;
}
else
{
return 0;
}
}
int divide(int num, int dem)
{
if (dem == 0)
{
printf("Undefined");
return 0;
}
else {
return (num/dem);
}
}
int randnum(int maxn)
{
if (maxn == 0)
{
maxn = 1;
}
srand(time(0));
return rand() % maxn;
}
int stoi(const char* str)
{
return atoi("str");
}
void itos(int n)
{
char* buf = "5";
int ret = sprintf(buf, "%i\n", n);
if (ret == -1){
printf("Error!");
return;
}
else{
printf(buf);
}
return;
}
यहाँ है एनएएसएम कोड:
; Declared C functions.
extern print
extern compare
extern divide
extern randnum
extern stoi
extern itos
section .data
msg: db 'Enter A Number One Through Ten:" : ', 10
ml: equ $ - msg
t: db 'Response did match!', 10
tl: equ $ - t
f: db 'Response did not match! The Answer Is:', 0
fl: equ $ - f
str2: db 'Hello'
section .bss
;srnum: resb 255
snum: resb 255
rnum: resb 255
num: resb 255
section .text
global _start ; Entry point function or label.
_start:
; System call sys_write
mov eax, 4
mov ebx, 1
mov ecx, msg
mov edx, ml
int 80h
; System call sys_read
mov eax, 3
mov ebx, 0
mov ecx, snum
mov edx, 255
int 80h
; Call stoi which converts string to int (parameter 1: is string to convert).
push snum
call stoi
mov [num], eax
mov ecx, esp
sub ecx, 4
mov esp, ecx
; Call random
push 10
call randnum
mov [rnum], eax
mov ecx, esp
sub ecx, 4
mov esp, ecx
; Compare the two integers.
mov eax, num
cmp eax, [rnum]
je true
jne false
true:
; Call sys_write
mov eax, 4
mov ebx, 1
mov ecx, t
mov edx, tl
int 80h
false: ; Segmentation fault is somewhere in this label
mov eax, 4
mov ebx, 1
mov ecx, f
mov edx, fl
int 80h
push rnum
call itos
; Calling sys_exit with exit code (0 = ERROR_SUCCESS)
mov eax, 1
mov ebx, 0
int 80h
सिर्फ शीर्षक के लिए +1 :) – Earlz
ठीक है, मैं अपने पहले झुकाव का विरोध करने जा रहा हूं (जो पूछना है "क्यों? गंभीरता से, क्यों?" :-) मुझे लगता है कि आपके पास सही जवाब है लेकिन मैं हूं उत्सुक क्यों है कि 'एफ' संदेश शून्य समाप्त हो गया है। सिस्कोल 4 के लिए यह आवश्यक नहीं है। शायद यह एक कट और पेस्ट से बचा है? – paxdiablo
डैनियल, आप सिस्टम हेडर के लिए '# शामिल" /usr/include/header.h "के बजाय' # शामिल करें 'का उपयोग कर सकते हैं (जब तक कि कुछ पथ कॉन्फ़िगरेशन समस्या न हो?) –
Fernando