在程序集8086中打印小的或大的字节序

问题描述 投票:1回答:1

我想在汇编程序中检查计算机的字节序(8086)并进行打印。

我知道什么是字节序以及如何找到它。它与数据在内存中的存储方式有关。例如,如果您存储1234,它将存储3412(小)或1234(大)。但是我不知道如何用汇编语言来实现。我正在考虑将某些内容存储在内存中,而不是将其加载并与原始内容进行比较。它应该完全如理论所说。如果我存储1234,我会将其加载为3412或1234。我尝试创建if语句时遇到问题。

litte db "little$" 
big db "big$"  

mov ax, var1
cmp ax, var2
je equal
jmp notequal


equal:
lea dx, big
notequal:
lea dx, little

我希望它打印的内容很少或很大,但是无论我在var1和var 2中输入什么值,它总是打印很少,因为以某种方式逐行执行了代码。它不应该只使用一个标签,“等于”或“等于”吗?我想要类似的东西:

if var1==var2
print big
else
print little
assembly x86-16
1个回答
2
投票

此段将总是打印“很少”,因为即使您从equal开始执行,它也将通过notequal进行:

equal:
    lea dx, big
notequal:
    lea dx, little

您需要的是类似的东西:

equal:
    lea dx, big
    jmp done
notequal:
    lea dx, little
done:
    ; carry on

另外,您应该将单词1234h存储到某个存储位置y,然后从同一位置读取byte

如果是12h,则您是大端。值34h表示小端。

其他所有内容都表示您有内存问题:-)

顺便说一下,我确定所有x86 CPU都是低位优先的,因此,如果您使用x86汇编语言编写此代码,则可能<。


通过示例,您可以将Coding Ground与以下代码结合使用以查看其运行效果:

section .text global _start _start: mov ax, 0x1234 ; load up 1234 hex mov [myword], ax ; store that word to memory mov al, [myword] ; get first byte of that cmp al, 0x12 ; 12 means big endian je big little: mov edx, l_len ; prepare for little message mov ecx, l_msg jmp print big: mov edx, b_len ; prepare for little message mov ecx, b_msg print: mov ebx, 1 ; file handle 1 = stdout mov eax, 4 ; 'syswrite' function call int 0x80 mov eax, 1 ; 'exit' function call int 0x80 section .data myword dw 0 l_msg db 'Little endian', 0xa l_len equ $ - l_msg b_msg db 'Big endian', 0xa b_len equ $ - b_msg

输出窗口如预期显示:

$ nasm -f elf *.asm; ld -m elf_i386 -s -o demo *.o $ demo Little endian

© www.soinside.com 2019 - 2024. All rights reserved.