我想在汇编程序中检查计算机的字节序(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
此段将总是打印“很少”,因为即使您从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