Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
传递参数C->;NASM->;C_C_Assembly_Nasm - Fatal编程技术网

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

传递参数C->;NASM->;C,c,assembly,nasm,C,Assembly,Nasm,诚然,这是一些家庭作业帮助,但一个我似乎无法克服的具体问题 我正试图写一个程序,它接受一个十六进制字符串,调用一个汇编函数,它给我十六进制字符串的十进制值。该汇编函数调用C中的“checker”函数,确保每个字符都是合法的十六进制值 我的问题是,如何在汇编程序中获取EBX寄存器,并将其正确地传递给需要字符的C函数。我似乎无法正确地从汇编程序传递回C。我是不是无意中在这里传递了一个指针?在我的一生中,我似乎也无法将单个字符从EBX中分离出来,即使将其分解为字节 注意,-1在字符无效时返回 我希望的

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

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

我的问题是,如何在汇编程序中获取EBX寄存器,并将其正确地传递给需要字符的C函数。我似乎无法正确地从汇编程序传递回C。我是不是无意中在这里传递了一个指针?在我的一生中,我似乎也无法将单个字符从EBX中分离出来,即使将其分解为字节

注意,-1在字符无效时返回

我希望的是:

请使用十六进制数字串输入最大4位十六进制整数:FBE 您输入:FBE FBE-F-15

我得到的是: 请使用十六进制数字串输入最大4位十六进制整数:FBE 您输入:FBE FBE-M--1

编辑:根据分配的检查数字功能只能使用单个字符。因此,我将分解主NASM函数中的字符串以获得完整的功能。仍在努力让它一次只使用一个角色

C:


您正在将参数传递到
hex2dig
(它是一个字符*)到
checkdigit
(它需要一个字符)。您需要将一个字符实际加载到寄存器中,然后将该寄存器推到堆栈上,以便将一个字符传递给
校验位

到目前为止,除了清除EDX之外,您似乎没有对EDX做任何事情。此外,在从堆栈加载其值之前,不需要将EBX清除为0(与写入“a=12;a=65;”相同——第一个赋值是不相关的,因为它会立即被丢弃)

无论如何,您已经将一个指向字符串的指针加载到EBX中。现在加载EBX指向的8位字节。其语法为[EBX],如下所示:

mov EDX, [EBX]
但这样做将加载4个字节(因为EDX是一个32位寄存器)。您只需要第一个字节,因此请指定EDX(DL)低8位的目标寄存器:

幸好您已经将EDX清除为0(因为上面的指令只覆盖底部的8位)。此时,EDX包含要处理的字节,因此将EDX推到堆栈上而不是EBX上


我希望这扩展了您对x86汇编的一般理解。

嗯,是的。这似乎是我无法做到的,将4字节字符串分解为单个字符。我尝试过:mov-EDX,EBX/和EDX,00000000000000000000000011111b/推送EDX尝试屏蔽一个字符。它用and指令来区分汇编代码中的错误。我也试过轮班。谢谢!为一点代码粗制滥造道歉。我真的不确定我是在传递指针还是值(就像我想要的那样)。这就解释了这么多。是的,当我编程太久的时候,它有助于揭开一些神秘的面纱。通常你希望
movzx-edx,byte[ebx]
加载一个字节,而不是将edx归零,然后合并成一个新的低字节。
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
mov EDX, [EBX]
mov DL, [EBX]