不可否認,這是一些家庭作業的幫助,但一個具體的問題,我似乎無法通過。傳遞參數C - > NASM - > C
我想寫一個程序,它需要一個字符串的十六進制字符,調用一個彙編函數,它給了我十六進制字符串的十進制值。該彙編程序函數在C中調用「檢查器」函數,以確保每個字符都是合法的HEX值。
我的問題是,我如何在彙編程序中使用EBX寄存器並將其正確地傳遞給C函數,期望字符。我似乎無法正確地從彙編程序返回到C.我是不小心在這裏傳遞了一個指針?即使將其分解爲字節,我也無法像從EBX中獲取單個字符一樣。
注意,當字符無效時返回-1。
什麼我希望的:
請使用十六進制數字的字符串輸入一個最大的4位十六進制整數:FBE 您輸入:FBE FBE - F - 15
我能得到什麼: 請輸入使用的十六進制數字的字符串最大4位十六進制整數:FBE 您輸入:FBE FBE - M - -1
編輯:根據分配必須只需要單個字符的校驗位功能。所以我將分解主NASM功能中的字符串以實現全部功能。仍然試圖讓它在時間,一旦字符工作..
C:
#include <stdio.h>
#include <string.h>
int main(void)
{
char input[255];
int dec_value;
while (1)
{
printf ("Please enter a maximal 4 digit hex integer using a string of hex digits: ");
scanf ("%s",input);
if (strlen(input) <= 4)
{
break;
}
printf ("The string is too long!\n");
}
printf ("You entered: ");
printf ("%s\n",input);
extern int hex2dec(char[]);
dec_value = hex2dec(input);
printf ("%i",dec_value);
if (dec_value == -1) {
printf ("There's an invalid character!\n");
}
else {
printf ("Decimal value of character %s is:%d \n", input, dec_value);
}
return 0;
}
int checkdigit (char hex)
{
printf (" - %c - ", hex);
if ((hex <= 70 && hex >= 65) || (hex >= 48 && hex <= 57)) {
if (hex >= 65) {
printf ("Letter");
return ((int) (hex-'A'+10));
}
else {
printf ("Number");
return hex - 48;
}
}
return -1;
}
NASM:
segment .data
segment .text
global hex2dec
extern checkdigit, printf
hex2dec:
push EBP
mov EBP,ESP
push EDX
push EBX
mov EDX,0D ; 0 EDX
xor EBX,EBX
mov EBX, DWORD [EBP+8] ; copy the string to EDX
push EBX
call printf ; print whole string
call checkdigit ; pass character to interpret
add ESP,4 ;on return clear the stack,
;the value is in EAX
pop EBX ;restore EBX
pop EDX ;restore EDX
pop EBP
ret
謝謝!道歉一點代碼cruft。我真的不確定是否傳遞了一個指針或值(像我想的那樣)。這很好解釋。是的,當我編程時間過長時,它有助於揭開一些神祕的東西。 – stirringhalo 2012-03-11 21:49:33