如何在装配8位和16位中比较和移动其他大小

时间:2015-05-08 12:14:04

标签: assembly

代码:

   AX=2013
    AL=AH+1
    if (BX<AL) then
    BX=AL
    BL=BH*3-AH
    end if 

任何人都可以将此代码转换为程序集吗?

2 个答案:

答案 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的原始值。