代码:
AX=2013
AL=AH+1
if (BX<AL) then
BX=AL
BL=BH*3-AH
end if
任何人都可以将此代码转换为程序集吗?
答案 0 :(得分:0)
由于您的问题标题,我认为这是导致您出现问题的部分:
if (BX<AL) then
BX=AL
首先,您需要清楚自己是否有未签名或签名的值。然后,您可以将8位寄存器归零或符号扩展为可用的16位寄存器,然后使用它进行比较和分配。比如无符号:
movzx cx, al ; zero extend to 16 bits
cmp bx, cx
jae skip ; unsigned condition
mov bx, cx
skip:
或签名:
movsx cx, al ; sign extend to 16 bit
cmp bx, cx
jge skip ; signed condition
mov bx, cx
skip:
如果不允许使用其他寄存器,则可以手动构建8位半的比较。无符号示例:
test bh, bh
jnz skip ; if bh != 0 then bx > al
cmp bl, al
jae skip
movzx bx, al
skip:
如果movzx
不可用(它是386+指令),您可以通过将前8位置零来模拟,例如:
test bh, bh
jnz skip ; if bh != 0 then bx > al
cmp bl, al
jae skip
xor bh, bh
mov bl, al
skip:
对于签名,它更复杂,留作练习: - )
答案 1 :(得分:0)
要处理不同的尺寸,例如 cmp bx,al ,有两种选择:
mov ah, 0
cmp bx, ax cmp bl, al
在这两种情况下,我们都要失去一些东西。在左边的代码中我们丢失AH,在正确的代码中忽略BH。
接下来是一个针对您的算法的小程序(使用EMU8086制作):
.model small
.stack 100h
.data
a_h db ?
.code
start:
;INITIALIZE DATA SEGMENT.
mov ax, @data
mov ds, ax
;LAO TA.
mov ax, 2013 ;AX = 2013.
mov al, ah ;AL = AH.
inc al ;AL + 1.
mov a_h, ah ;PRESERVE AH FOR LATER, BECAUSE WE WILL LOSE IT.
mov bx, 7 ;WE NEED A VALUE THAT WILL TAKE US TO THE "THEN".
;IF ( BX < AL ).
mov ah, 0 ;CLEAR AH TO USE AX (YOU SEE, WE JUST LOST AH).
cmp bx, ax ;CMP BX, AL (BECAUSE AH=0).
jae not_less ;IF ( BX >= AX ) JUMP TO NOT_LESS.
;THEN (EXECUTES IF BX < AX).
mov bx, ax ;BX = AL (BECAUSE AH=0).
;BH * 3.
mov al, 3 ;NECESSARY FOR MUL.
mul bh ;BH * AL. RESULT = AX.
mov bh, al ;ASSUME RESULT FITS IN AL (RESULT <= 255).
;BH*3 - AH.
sub bh, a_h ;THIS IS THE AH WE PRESERVED BEFORE.
;BL = (BH*3 - AH).
mov bl, bh
;END IF.
not_less:
;WAIT FOR ANY KEY.
mov ah, 7
int 21h
;FINISH PROGRAM.
mov ax, 4c00h
int 21h
end start
接下来是测试数据,注意我必须为BX分配一个合适的值才能输入IF:
AX = 2013 ------------> AX = 7DDh (AL=DD, AH=7).
AL = AH + 1 ----------> AL = 7+1 = 8.
BX = 7 ---------------> WE NEED A VALUE THAT WILL TAKE US TO THE "THEN".
if (BX < AL) then ----> IF ( 7 < 8 ).
BX = AL ------------> BX = 8 (BL=8, BH=0).
BL = BH * 3 - AH ---> BL = (0 * 3 - 7) = -7.
end if
值得一提的是,在与BX和AL合作时,我们正在失去BH。为了防止这种情况,我们可以使用BL和AL或BH和AL。
另一件事,我在开始时保留了原来的AH(7),因为我们丢失了两次:在IF下(比较BX与AL,AH之前被清除)和MUL(因为结果需要整个AX) 。没有必要保留AH,但这会改变最终结果:
AX = 2013 ------------> AX = 7DDh (AL=DD, AH=7).
AL = AH + 1 ----------> AL = 7+1 = 8.
BX = 7 ---------------> WE NEED A VALUE THAT WILL TAKE US TO THE "THEN".
if (BX < AL) then ----> IF ( 7 < 8 ).
BX = AL ------------> BX = 8 (BL=8, BH=0).
BL = BH * 3 - AH ---> BL = (0 * 3 - 0) = 0.
end if
这个新结果是因为BH * 3将结果留在AX中,0 * 3 = 0.这就是为什么我选择保留AH的原始值。