assembly 如何在x86汇编中将unsigned整型转换为signed整型?(使用c函数)

swvgeqrz  于 2022-11-24  发布在  其他
关注(0)|答案(1)|浏览(116)

我试图将二进制文件的内容读取为带符号的int,但fread一直将其解释为不带符号的。
我使用fopen函数从x86汇编代码中阅读该文件:

mov  rdi, file      ;;File is entered as input before
    mov  rsi, mode      ;;mode db "rb",0
    sub  rsp, 8
    call fopen
    add  rsp, 8
    mov  [handle], rax  ;I save the file handler in a variable

说文件,包含以二进制存储的数字,一个挨着另一个。如果你读这个文件,你会看到:..2
使用十六进制编辑器,我们可以看到这些数字是:
| 十六进制|以10为基数的符号8位值|
| - -|- -|
| CA认证|-5个|
| 九十|-1个|
| 三十二|五十个|
稍后我要逐字节读取每个存储值:

mov  rdi, number
    mov  sil, 1         ;;Each number is 1 byte in size
    mov  rdx, 1
    mov  rcx, [handle]
    sub  rsp, 8
    call fread
    add  rsp, 8
    cmp  rax, 0
    jle  EOF

这一部分是成功的,我设法将CA保存在number变量中。但是,调试器告诉我number变量的值为:202
这是CA的无符号值。因此我尝试使用sscanf将其转换为有符号的对应值:

mov  rdi, number
    mov  rsi, signed    ;; signed db "%hhi",0 (As I understand it, this represents the 8 bit signed format)
    mov  rdx, numberInt
    sub  rsp, 8
    call sscanf
    add  rsp, 8

然而,这不起作用,从RAX寄存器如何返回0值和数字仍然评估为202可以看出。

roqulrg3

roqulrg31#

C语言中的示例

char ch;
    int i;

    fread(&ch, 1, 1, stdin);

    i = ch;

    printf("%d\n", i);
}

和生成的代码:

sub     rsp, 24
        mov     rcx, QWORD PTR stdin[rip]
        mov     edx, 1
        mov     esi, 1
        lea     rdi, [rsp+15]
        call    fread
        movsx   esi, BYTE PTR [rsp+15] <<<<<<<<<< 
------------------------------------------------
        mov     edi, OFFSET FLAT:.LC0
        xor     eax, eax
        call    printf
        xor     eax, eax
        add     rsp, 24
        ret

相关问题