对于int $0x80引发的问题

------------------------------------------------------软中断--------------------------------------------------------------------------------------
在Linux 的汇编语言中(AT&T,x86汇编两种语法的一种),int 指令被称为软中断指令 ,可以用此指令去故意产生一个异常 ,(异常与中断有点类似, 过程相当于CPU从用户模式切换到特权模式, 然后跳转到内核代码中执行异常处理的代码。)

在int 指令中的立即数 0x80 是一个参数 , 可以用于执行系统调用。
int3则主要用于设置断点(对程序进行调试)  

------------------------------------------------------软中断实现过程-----------------------------------------------------------------------------

原因:通过限定应用程序和内核程序使用不同的内存分配函数,将用户空间程序限制在0-3G空间,将内核程序限制在3G~4G空间,这样就实现了用户空间和内核空间的隔离;

交互方式:通过 软中断(int $0x80  )实现用户空间与内核空间的交互。

 系 统调用是一个软中断,中断号是0x80,它是上层应用程序与Linux系统内核进行交互通信的唯一接口。通过int 0x80,就可使用内核资源。不过,通常应用程序都是使用具有标准接口定义的C函数库间接的使用内核的系统调用,即应用程序调用C函数库中的函数,C函数 库中再通过int 0x80进行系统调用。

    所以,系统调用过程是这样的:
        应用程序调用libc中的函数->libc中的函数引用系统调用宏->系统调用宏中使用int 0x80完成系统调用并返回


----------------------------------------------------最基本代码实现-----------------------------------------------------------------------------
在linux中 , int $0x80 这种异常被称作系统调用(systerm call) ,内核中也提供了许多系统服务供用户程序使用 ,但这些系统服务不能像库函数一样用的为所欲为, 原因在于 :执行用户程序的时候CPU处于用户模式 ,经由异常处理的 程序进入到内核 ,用户只能通过寄存器传递几个参数 ,之后就要按照内核设计好的代码路线走 ,调用结束后 ,CPU在切回到用户模式, 继续执行下一条 int $0x80 的下一条指令 。这个方式该不了 (除非你改系统代码)。。。这也是保证系统服务的安全。

基本的“hello world”
#
#Simple program that exits and returns a status code back to the Linux kernel
#
./section .data 

./section .text
.globl _start 
_start :
movl $1 ,%eax 
movl $4 , %ebx 
int $0x80

1.保存为hello.s 
2.$as hello.s -o hello.o(编译为机器代码)
3.ld hello.o -o hello(链接器链接为可执行文件 )

代码解析:
----------------------------------------------------------------------------------------------------------------------------------------------------------------
  1. .section .data :以.为开头的名称不是指令的助记符 ,不会被翻译为机器指令,而是作为一种汇编提示告知汇编器 ,这个形式直接被称为 “汇编指令” 或 ”伪操作“
  2. .section .text : .text 段位保存代码, 是只读和可执行的。后面的指令都是属于 .text 段。 
  3. _start 是一个符号, 符号在汇编中表示一个地址 ,可以再指令中 ,汇编程序经过汇编器的处理后, 所有的符号都被替换成为它所代表的地址值 。(通俗说,c语言中的函数变量名都属于符号)
  4. .global 告诉编译器, _start 这个符号就像c程序中的main函数一样 ,是整个程序的入口 。故这个在程序中必须有。
  5. movl $1 ,%eax :这个是一条数据传送指令 ,这指令要求CPU内部产生一个数字1并保存到eax寄存器中 ,mov后缀l表示long形 ,说明为32位。(1表示在CPU内部产生 ,称为立即数,立即数在前面要加个$ ,寄存器就加个% 
  6. eax 和ebx 是传递给系统调用的两个参数 ,eax 是系统调用号。 Linux 各种系统调用都是有int $0x80 指令引发的,内核需要通过eax 判断用户需要哪个系统调用。 
  7. _ebx 的值是传给 _exit 的参数,表示退出状态。_exit 的系统调用号为1 。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------

参考资料:
《Linux C一站式编程》
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Python的ValueError是一种错误类型,表示无效的值错误。该错误可能会出现在将字符串转换为整数时,当字符串不符合整数的格式时会出现。 在这个特定的错误消息中,报告了一个无效的字面值为int()的十进制字符串。具体地说,字符串是'0x0',以'0x'开头,表示这是一个十六进制数。 在Python中,int()函数可以将字符串转换为整数。如果使用int()函数的默认参数,它将假设字符串是十进制的。由于'0x0'是一个十六进制字符串,而不是十进制字符串,因此无法进行转换,并触发了ValueError。 要解决这个错误,有几种可能的方法: 1. 如果你想要将十六进制字符串转换为整数,你可以使用int()函数的第二个参数来指定基数为16。例如,int('0x0', 16)将返回0。 2. 如果你希望将'0x0'解释为十进制数,请确保字符串的前缀'0x'被移除,例如使用int('0x0'.replace('0x', ''))来转换。 3. 如果'0x0'是无意间出现的错误字符串,你应该检查代码的逻辑,找出为什么会出现这样的字符串,并修复它。 无论哪种情况,了解错误消息的含义以及适当地处理或修复即可解决这个ValueError。 ### 回答2: 这个错误是由于将一个不符合十进制格式的字符串作为参数传递给int()函数引起的。在Python中,int()函数用于将一个字符串转换为整数,但是字符串必须符合十进制格式。 在这个错误消息中,字符串'0x0'以'0x'开头,这是表示十六进制数字的前缀。然而,int()函数默认仅支持十进制字符串,因此会引发ValueError。 要解决这个问题,可以使用int()函数的第二个参数指定基数。对于十六进制数字,基数应为16。例如,要将字符串'0x0'转换为十进制整数,可以使用int('0x0', 16)。 下面是一个示例代码来处理这个错误: try: number = int('0x0', 16) print(number) except ValueError as e: print('Invalid literal for int():', e) 这个代码将输出转换后的整数0。通过指定基数为16,我们告诉int()函数解释字符串中的数字为十六进制格式。 ### 回答3: Python 中的 ValueError 是一种常见的异常类型,它表示出现了数值转换错误的情况。在这个错误信息中,出现了一个十六进制格式的字符串 '0x0',但尝试使用 int() 函数将其转换为十进制整数时发生了错误。 '0x0' 是一个表示十六进制数字的字符串,其中 '0x' 是十六进制数的标识符,后面跟着表示数值的十六进制数。在使用 int() 函数时,我们可以指定第二个参数作为将字符串解析为整数时使用的基数。如果没有指定基数,默认情况下认为字符串是十进制格式。 然而,'0x0' 不是一个有效的十进制数值,而是一个十六进制数值。因此,当我们尝试使用 int() 函数将其转换为十进制整数时,会引发 ValueError。为了解决此问题,我们可以使用 int() 函数的第二个参数来指定基数为 16,即十六进制数。示例如下: ```python value = '0x0' result = int(value, 16) print(result) # 输出结果为 0 ``` 在上述示例中,我们将 value 字符串传递给 int() 函数,并指定基数为 16。这样,int() 函数将按照十六进制格式解析字符串,并将其转换为对应的十进制整数。对于 '0x0',结果将是 0。 通过指定正确的基数,我们可以解决这个 ValueError 异常

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值