gpt4 book ai didi

linux - 比较 nasm 中的 16 位数字会产生错误的结果

转载 作者:太空宇宙 更新时间:2023-11-04 09:35:53 25 4
gpt4 key购买 nike

我刚开始学习汇编。我在 32 位模式下编码 nasm。我正在尝试比较用户输入的 3 个数字并打印最大的数字。但是,如果我只使用 resb 2 为每个数字保留 16 位,我似乎无法正确比较数字。但是,当我使用 resw 2 为数字保留 32 位时,我确实得到了正确的结果。我不明白为什么这是案件。这是我的代码:

SYS_EXIT equ 1
SYS_WRITE equ 4
SYS_READ equ 3
STD_IN equ 0
STD_OUT equ 1

segment .data

msg1 db "Enter first number",0xA
msg1_len equ $- msg1

msg2 db "Enter second number",0xA
msg2_len equ $- msg2

msg3 db "Enter third number",0xA
msg3_len equ $- msg3

msg4 db "Largest number is ",0xA
msg4_len equ $- msg4

segment .bss

num1 resb 2
num2 resb 2
num3 resb 2
res resb 2

section .text

global _start

_start:

mov eax, SYS_WRITE
mov ebx, STD_OUT
mov ecx, msg1
mov edx, msg1_len
int 0x80

mov eax, SYS_READ
mov ebx, STD_IN
mov ecx, num1
mov edx, 2
int 0x80

mov eax, SYS_WRITE
mov ebx, STD_OUT
mov ecx, msg2
mov edx, msg2_len
int 0x80

mov eax, SYS_READ
mov ebx, STD_IN
mov ecx, num2
mov edx, 2
int 0x80

mov eax, SYS_WRITE
mov ebx, STD_OUT
mov ecx, msg3
mov edx, msg3_len
int 0x80

mov eax, SYS_READ
mov ebx, STD_IN
mov ecx, num3
mov edx, 2
int 0x80

mov ecx, [num1]
cmp ecx, [num2]
jg check_third
mov ecx, [num2]


check_third:

cmp ecx, [num3]
jg result
mov ecx, [num3]

result:
mov [res], ecx
mov eax, SYS_WRITE
mov ebx, STD_OUT
mov ecx, msg4
mov edx, msg4_len
int 0x80

mov eax, SYS_WRITE
mov ebx, STD_OUT
mov ecx, res
mov edx, 2
int 0x80

exit:
mov eax, SYS_EXIT
int 0x80

抱歉,如果它有很多重复代码。我理解为什么我需要 2 个字节来存储键盘输入,而假设 ascii 字符的长度只有 8 位(因为标准输入还将读取除数字之外的换行符)。但是,我不知道很多关于 nasm 如何工作的事情,例如当我将 16 位内存移动到 32 位寄存器时它如何 react ,它如何比较 32 位和 16 位值(它会进行签名扩展还是填充二进制减法前为 0)。如果有人能向我推荐有关 nasm 技术细节的资源,除了解释为什么我需要保留 2 个词来进行比较之外,我将非常感激。

最佳答案

Nasm 不像其他一些汇编程序那样在标签处记录数据的大小。假设您输入 1、2 和 3。存储在标签中的字节将是:

num1: db 0x31, 0x0A
num2: db 0x32, 0x0A
num3: db 0x33, 0x0A

当您从标签 num1 移动 32 位数据时,您实际上也在从 num2 移动数据。因为小端机器首先存储最低有效字节,所以你会得到如下内容:

    mov ecx, 0x0A320A31 ; high bytes contain num2 and low bytes contain num1
cmp ecx, 0x0A330A32 ; high bytes contain num3 and low bytes contain num2
jg check_third
mov ecx, 0x0A330A32
check_third:
cmp ecx, 0x00000A33 ; high bytes contain res and low bytes contain num3
jg result
.....

resw 2(或 resd 1)可以工作,因为预留内存被初始化为零。正如 Frank 在评论中所说,您应该使用 cl 而不是 ecx 因为在这种情况下您只需要处理 8 位。

关于linux - 比较 nasm 中的 16 位数字会产生错误的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26570229/

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