我想在汇编程序 ( 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
,然后从同一位置读回字节。
如果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