c - 传递参数 C -> NASM -> C

标签 c assembly nasm

诚然,这是一些家庭作业帮助,但我似乎无法解决一个具体问题。

我正在尝试编写一个程序,该程序接受十六进制字符的字符串,调用汇编器函数,该函数给出十六进制字符串的十进制值。该汇编器函数调用 C 中的“检查器”函数,以确保每个字符都是合法的十六进制值。

我的问题是,如何在汇编程序中获取 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

最佳答案

您将 hex2dig(这是一个 char *)的参数传递给 checkdigit(它需要一个字符)。您需要实际将一个字符加载到寄存器中,然后将该寄存器压入堆栈以将字符传递给checkdigit

关于c - 传递参数 C -> NASM -> C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9649017/

相关文章:

c - 在另一个整数的 MSB 位置左侧的整数中查找 N 个连续的零位

assembly - ASM - 推/弹出

linux - 在没有符号的情况下调试时如何跳过(不执行!)GDB 中的调用?

linux - 浮点异常错误(核心转储)

linux - 如何使用 nasm 编译带有 .bss 部分的共享文件

c - 从文件中读取测试用例

c - 追加到 C 数组时出现总线错误

c - 如何将多个参数传递给 C 中的线程

assembly - GNU 汇编器中的本地标签; gdb 打印回溯,就好像标签是函数一样

assembly - 如何通过 x86 BIOS 调用移动光标?