在装配 8086 中打印小端或大端

  • 本文关键字:打印 8086 assembly x86-16
  • 更新时间 :
  • 英文 :


我想在汇编程序 ( 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

最新更新