传递参数C->;NASM->;C
诚然,这是一些家庭作业帮助,但一个我似乎无法克服的具体问题 我正试图写一个程序,它接受一个十六进制字符串,调用一个汇编函数,它给我十六进制字符串的十进制值。该汇编函数调用C中的“checker”函数,确保每个字符都是合法的十六进制值 我的问题是,如何在汇编程序中获取EBX寄存器,并将其正确地传递给需要字符的C函数。我似乎无法正确地从汇编程序传递回C。我是不是无意中在这里传递了一个指针?在我的一生中,我似乎也无法将单个字符从EBX中分离出来,即使将其分解为字节 注意,-1在字符无效时返回 我希望的是: 请使用十六进制数字串输入最大4位十六进制整数:FBE 您输入:FBE FBE-F-15 我得到的是: 请使用十六进制数字串输入最大4位十六进制整数:FBE 您输入:FBE FBE-M--1 编辑:根据分配的检查数字功能只能使用单个字符。因此,我将分解主NASM函数中的字符串以获得完整的功能。仍在努力让它一次只使用一个角色 C:传递参数C->;NASM->;C,c,assembly,nasm,C,Assembly,Nasm,诚然,这是一些家庭作业帮助,但一个我似乎无法克服的具体问题 我正试图写一个程序,它接受一个十六进制字符串,调用一个汇编函数,它给我十六进制字符串的十进制值。该汇编函数调用C中的“checker”函数,确保每个字符都是合法的十六进制值 我的问题是,如何在汇编程序中获取EBX寄存器,并将其正确地传递给需要字符的C函数。我似乎无法正确地从汇编程序传递回C。我是不是无意中在这里传递了一个指针?在我的一生中,我似乎也无法将单个字符从EBX中分离出来,即使将其分解为字节 注意,-1在字符无效时返回 我希望的
您正在将参数传递到
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]