gpt4 book ai didi

c - 指针减法,32位ARM,负距离报告为正

转载 作者:行者123 更新时间:2023-11-30 18:36:13 26 4
gpt4 key购买 nike

当执行指针减法且第一个指针小于第二个指针时,ARM 处理器出现下溢错误。

示例代码:

#include <stdint.h>
#include <stdbool.h>

uint8_t * p_formatted_data_end;
uint8_t formatted_text_buffer[10240];

static _Bool
Flush_Buffer_No_Checksum(void)
{
_Bool system_failure_occurred = false;
p_formatted_data_end = 0; // For demonstration puposes.
const signed int length =
p_formatted_data_end - &formatted_text_buffer[0];
if (length < 0)
{
system_failure_occurred = true;
}
//...
return true;
}

IAR编译器生成的汇编代码为:

    807          static _Bool
808 Flush_Buffer_No_Checksum(void)
809 {
\ Flush_Buffer_No_Checksum:
\ 00000000 0xE92D4070 PUSH {R4-R6,LR}
\ 00000004 0xE24DD008 SUB SP,SP,#+8
810 _Bool system_failure_occurred = false;
\ 00000008 0xE3A04000 MOV R4,#+0
811 p_formatted_data_end = 0; // For demonstration purposes.
\ 0000000C 0xE3A00000 MOV R0,#+0
\ 00000010 0x........ LDR R1,??DataTable3_7
\ 00000014 0xE5810000 STR R0,[R1, #+0]
812 const signed int length =
813 p_formatted_data_end - &formatted_text_buffer[0];
\ 00000018 0x........ LDR R0,??DataTable3_7
\ 0000001C 0xE5900000 LDR R0,[R0, #+0]
\ 00000020 0x........ LDR R1,??DataTable7_7
\ 00000024 0xE0505001 SUBS R5,R0,R1
814 if (length < 0)
\ 00000028 0xE3550000 CMP R5,#+0
\ 0000002C 0x5A000009 BPL ??Flush_Buffer_No_Checksum_0
815 {
816 system_failure_occurred = true;
\ 00000030 0xE3A00001 MOV R0,#+1
\ 00000034 0xE1B04000 MOVS R4,R0

减法指令SUBS R5,R0,R1相当于:

R5 = R0 - R1

如果结果为负,CPSR 寄存器中的 N 位将被置位。引用:ARM Architecture Reference Manual 的 A4.1.106 SUB 节

让:

R0 == 0x00000000
R1 == 0x802AC6A5

寄存器R5的值为0x7FD5395C。CPSR寄存器的N位为0,表示结果不为负

Windows 7 计算器应用程序报告负值,但仅限于以 64 位表示时:FFFFFFFF7FD5395C

作为实验,我使用 ptrdiff_t 类型作为长度,并生成了相同的汇编语言。

问题:

  1. 将指针减法的结果传递给下溢?
  2. 将距离视为负数的建议数据类型是什么?

平台:
目标处理器:ARM Cortex A8 (TI AM3358)
编译器:IAR 7.40
开发平台:Windows 7。

最佳答案

Is this valid behavior, to have the result of pointer subtraction to underflow?

是的,因为您的情况的行为未定义。 任何行为在那里都是有效的。正如注释中所观察到的,两个指针之间的差异仅针对指向同一数组对象的元素或指向数组对象的最后一个元素的指针定义(C2011,6.5.6/9)。

What is the recommended data type to view the distance as negative?

在定义它的地方,两个指针相减的结果被指定为 ptrdiff_t 类型,这是一种实现定义大小的有符号整数类型。如果您计算 p1 - p2,其中 p1 指向数组元素,而 p2 指向同一数组的后一个元素,则结果将是一个负数,表示为 ptrdiff_t

关于c - 指针减法,32位ARM,负距离报告为正,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42304373/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com