assembly 什么是汇编语言中的IF ELSE和ENDIF指令?我正在尝试做一个程序,其中一些条件真消息显示

lstz6jyr  于 2022-12-23  发布在  其他
关注(0)|答案(3)|浏览(156)
Dosseg
.model small
.stack 100h
.data

X db 89
z db ?

msg1 db "heloo$"

.code
main proc

mov ax,@data
mov ds,ax

mov z,offset x
;X=89
Y=-3
IF (z LT 0) OR (z GT 79)
lea dx,msg1
mov ah,9
int 21h
ENDIF

IF (Y LT 0)
lea dx,msg1
mov ah,9
int 21h
ENDIF 
   
mov ah,4ch
int 21h

MAIN ENDP
END MAIN
a7qyws3x

a7qyws3x1#

如问题中所示,ifelseendif是包括或排除汇编代码行的汇编时条件。在Microsoft Masm(6.11或更高版本)中,.if.else.endif是运行时条件。链接到Masm点指令:
https://learn.microsoft.com/en-us/cpp/assembler/masm/directives-reference?view=msvc-170

vptzau2j

vptzau2j2#

在结构化编程中,我们有if-then语句,它的模式如下:

if ( condition ) 
    then-part

在汇编语言的if-goto-label风格中(在C语言中),相同的模式如下所示:

if ( ! condition ) goto endIf1;
    then-part
endIf1:

在if-goto-label风格中,我们告诉程序何时跳过then-part,而在C中,我们告诉程序何时执行then-part。因此,if-goto-label的条件需要被否定。
构造if ( condition ) goto endIf1;是C语言版本的条件分支。在汇编语言中,条件转移通常作为比较和转移序列完成。例如:

if ( Y < 0 ) 
    print "hello"

变成:

if ( Y >= 0 ) goto endIf1;
    print "hello"
endIf1:

其变为:

cmp Y, 0
    jge endIf1
    lea dx, msg1
    mov ah, 9
    int 21h
endIf1:
8ftvxx2r

8ftvxx2r3#

下面是使用ifdef的适当时机示例:

CPU_8086 equ 1 ;comment this line out to enable "shr al,4"

PrintHex:
   push ax
   ifdef CPU_8086
      shr al,1
      shr al,1
      shr al,1
      shr al,1
   else
      shr al,4  ;original 8086 couldn't do this
   endif

   call PrintHexChar
   pop ax
PrintHexChar:
   and al,0Fh
   daa
   add al,0F0h
   adc al,40h
   mov ah,0Eh
   int 10h
   ret

相关问题