【发布时间】:2021-06-12 06:43:58
【问题描述】:
我有一个关于如何在 x86 汇编 eax 寄存器中移动值的问题。我知道 32 位寄存器分解成更小的组件寄存器,低 16 位是 ax,16 位进一步分解成 8 位寄存器 ah 和 al。
我目前正在为 x86 汇编语言赋值编写一个程序,该程序希望我仅使用 mov、add 和 sub 命令在寄存器中移动四个 8 位十六进制值。该程序首先让您通过加减变量的值来移动变量的值,这没问题。
第二部分(phase2)是将每个值放入每个 eax 8 位位置。但是,我知道你只能访问较低的两个 8 位位置(“ah”和“al”。)我需要以某种方式将 ah 和 al 一起移动到 eax 的前 16 位中,将添加的值推到 ah 和al 留下两个字节的位置? (问号,因为我不知道。)我相当确定我可以将正确的值添加回 ah 和 al 以完成解决方案。
我相信这样做的方法是向 ah 添加“一些十六进制值”并留下溢出,但我似乎无法理解它的逻辑。 “从逻辑上讲,”我想说这似乎是最好的行动方案,但我不确定如何实施。而且,由于我无法理解它,所以我找不到我应该找到的隐藏算法。 Phase2 应该只是 aprx 21 行,所以我知道它不是一个庞大的添加指令列。
任何关于如何考虑这一点的方向都将受到高度赞赏。感谢任何人。
.386
.model flat,stdcall
.stack 4096
ExitProcess proto,dwExitCode:dword
.data
var1 BYTE 'A'
var2 BYTE 'B'
var3 BYTE 'C'
var4 BYTE 'D'
.code
main proc
;phase1
mov al, var1; store 'A'
mov ah, var4; store 'D'
mov var1, ah; move 'D' to var1
sub ah, 1; make ah 'C'
mov var4, ah; move 'C' to var4
sub ah, 1; make ah 'B'
mov var3, ah; move 'B' to var3
mov var2, al; 'mov al to var2
;var1 BYTE 'D'
;var2 BYTE 'A'
;var3 BYTE 'B'
;var4 BYTE 'C'
;phase2
mov ah, var1; store 'D'
mov al, var2; store 'A'
; this is where I want to shift al and ah left two bytes
; once the first two bytes of eax equal 'DA' move 'B' 'C'
; into ah and al
mov ah, var3; store 'B'
mov al, var4; store 'C'
;eax should read 'DABC' = 44414243
invoke ExitProcess,0
main endp
end main
【问题讨论】:
-
尝试移位。
-
感谢 Erik 的快速回复。如果您指的是移位指令 shr 和 shl,则该赋值将我们限制为 mov add 和 sub 命令。 shift 命令是所有搜索都告诉我要做的,但我不能使用它。这是一个逻辑十六进制添加问题。
-
左移是乘以2,可以通过加法来实现。所以 16 次加法是一种无聊但有效的 16 位移位方法。或者,您可以重新排列内存中的数据。
-
谢谢,小丑,我会试试的。但是,会不会只是重复的```添加啊,al```之类的东西?还是你的意思是像 ``` 添加 ax, '0FFh' ``` 十六次? -编辑-或;一旦 ah 和 al 就位,然后将其移动到 bx 然后将 bx 添加到 ax 16 次...?