x86汇编如何使用伪指令实现if,else,while,dowhile,switch-case

 

 

x86汇编如何使用伪指令实现if,else,while,dowhile,switch-case
1)汇编伪指令介绍
伪指令是汇编器提供的语法规则,它主要为程序员提供语法糖简化汇编代码的编写。常见的伪指令包括条件汇编类(IF,ELSE,ENDIF)和宏定义类(MACRO,ENDM)。结合伪指令和处理器跳转指令,可模拟高级语言的控制结构,增强程序的可读性和可维护性。
在x86汇编中if/else/while等高级控制语句,运行时的控制结构核心是通过处理器跳转指令JZ,JNZ,JMP等标签实现,伪指令仅作为辅助手段如封装重复逻辑,提升代码可读性。
IF:运行时通过比较指令CMP+条件跳转指令实现分支逻辑;汇编阶段的IF伪指令仅用于条件编译根据表达式真假决定代码是否被编译。
WHILE:通过标签+条件跳转指令+循环体+无条件跳转指令模拟,伪指令可封装该逻辑减少冗余。
DO-WHILE:先执行循环体,再通过“条件跳转指令”判断是否继续循环,核心是跳转指令而非伪指令。
SWITCH-CASE:虽然它在x86没有指定的伪指令,但是咱们也可以通过if-else和跳转表+JMP间接跳转来实现它。


2)if,else伪指令了介绍
if和else是编程中广泛使用的控制结构,它们允许程序根据特定条件决定执行流程。需要注意的是,if和else本身并不是真正的机器指令,而是伪指令。这意味着它们在程序执行前会被编译器或汇编器处理,并最终被转换成实际的机器可执行代码。
if指令用于检查一个条件是否成立。如果条件为真True,则执行if语句块内的代码。
else指令用于指定在if条件不成立时执行的代码块。也就是说,else是if语句的备用执行路径。
这些伪指令提供了基本的条件控制流,使得程序能够做出决策和执行不同的任务。虽然它们在高级编程语言中非常常见,但在底层机器代码中,通常会通过跳转指令如JUMP来实现相似的功能。在汇编语言中,if和else通常会被转换成条件跳转指令如JE,JNE,JZ等,允许咱们的程序在不同的条件下执行不同的代码语句。

3)while,dowhile伪指令介绍
while和do-while是常见的循环控制结构,用于重复执行一段代码块,直到满足特定条件为止。类似于if和else,它们是高级编程语言中的概念,在底层汇编或机器代码中,循环结构通常由跳转指令来实现。
while伪指令
while循环首先判断条件的真假。如果条件为真True,则执行循环体内的代码。执行完毕后再次检查条件是否成立。这个过程会重复进行,直到条件变为假False,此时循环结束。简单来说,while循环是先判断,后执行。
do-while伪指令
do-while循环与while循环的不同之处在于,do-while循环会先执行一次循环体,然后再判断条件是否成立。如果条件为真(True),则继续执行循环。这意味着do-while循环至少会执行一次循环体内的代码。总结来说,do-while循环是先执行,后判断。

4)switch-case伪指令???
switch-case是一种常见的多分支控制结构它允许程序根据一个变量的值选择执行不同的代码块。在高级编程语言中switch-case通过不同的case标签来跳转到相应的代码分支,从而简化了多重if-else判断。
咱们在学习x86汇编中,并没有直接对应的switch-case伪指令。但是咱们可以通过其他控制流结构if-else或跳转表来模拟switch-case的功能。常见的实现方法包括:
if-else
使用一系列的if-else语句来判断变量的值,并执行相应的代码块。虽然这种方式比较直观,但对于大量的条件判断会导致代码冗长且效率较低。
跳转表
将所有的case标签映射到一个地址表即跳转表,然后根据变量的值直接跳转到对应的代码位置。这种方式效率较高,尤其适用于switch-case中分支较多且连续的情况。
汇编语言中的跳转指令JMP,JE,JNE等是实现这些模拟分支控制的关键,它们使得程序能够根据不同的条件跳转到不同的代码区域,从而实现switch-case的功能。

5)案例

;sdk
;https://masm32.com/download.htm
;Project mouse rigth propertis
;Microsoft Macro Assembler -> General -> Include Paths
;C:\masm32\include
;Linker -> General -> Additional Library Directories
;C:\masm32\lib

;Project mouse right -> Build Dependencies -> Build Customizations
;Project mouse file.asm -> propertis -> item type -> Microsoft Macro Assembler

;vs2022 is error
;masm build
;cmd
;C:\masm32\bin\ml.exe /c /nologo /Zi /Fo"Debug\asm2masm32InputOut.obj" /I "C:\masm32\include" /W3 /coff /Cp /TaD:\asm2masm32InputOut.asm
;cd Project4
;C:\masm32\bin\link.exe /SUBSYSTEM:CONSOLE /LIBPATH:C:\masm32\lib Debug\asm2masm32InputOut.obj user32.lib kernel32.lib /OUT:asm2masm32InputOut.exe

;or
;*.asm mouse rigth find propertis -> Item type select "Cutom Build Tool" -> In General "Command Line" input
;C:\masm32\bin\ml.exe /c /nologo /Zi /Fo"$(OutDir)\$(FileName).obj" /I "C:\masm32\include" /W3 /Ta"$(ProjectDir)asm2masm32InputOut.asm"

;or finally done change error code
;alrt_eventname WCHAR  (EVLEN + 1) dup(?)
;alrt_servicename WCHAR (SNLEN + 1) dup(?)

;asmdude2



.586   ; Support Pentium instruction set
.MODEL flat,stdcall  ; Flat memory model, standard Windows calling convention
option casemap:none  ; Case-sensitive naming matches Windows API

; Link Windows core libraries
include windows.inc
include user32.inc
include kernel32.inc
include msvcrt.inc
include masm32.inc
includelib user32.lib
includelib kernel32.lib
includelib msvcrt.lib
includelib masm32.lib


.data
szText    db 'Input put string:',0
szTest    db '%s',0
szText1   db 'masm32', 0ah,0

;scanf
szInputText db 0
szFormat db "%s",0

o1 dword 100
o2 dword 100

x dword ?
y dword ?

i dword 0


case DWORD 4          
; Prompt strings
msg1 db "Case 1 executed", 0Ah, 00h
msg2 db "Case 2 executed", 0Ah, 00h
msg3 db "Case 3 executed", 0Ah, 00h
msg4 db "Case 4 executed", 0Ah, 00h
msg5 db "Case 5 executed", 0Ah, 00h
msgDefault db "Default case executed", 0Ah, 00h

.code
_mainCRTStartup PROC
    ;if else
    ;if(o1 == o2)
    ;{
    ; x = 1
    ; y = 1
    ;}
    ;else
    ;{
    ; x = 1
    ; y = 2
    ;}
    ;

    mov eax,o1
    .if eax == o2
    mov x,1
    mov y,1
    .elseif eax > o1
    mov x,1
    mov y,3
    .else
    mov x,1
    mov y,2
    .endif



    ;while(i < 100)
    .while i < 100
    inc i
    .endw

    ;do while
    mov i,0 
    .repeat
        inc i
    .until i > 100


    ;Switch-Case
    mov eax, case
    ; Simulate case 1
    .if eax == 1
        push offset msg1
        call StdOut
        add esp, 4
    ; Simulate case 2
    .elseif eax == 2
        push offset msg2
        call StdOut
        add esp, 4
    ; Simulate case 3
    .elseif eax == 3
        push offset msg3
        call StdOut
        add esp, 4
    ; Simulate case 4
    .elseif eax == 4
        push offset msg4
        call StdOut
        add esp, 4
    ; Simulate case 5
    .elseif eax == 5
        push offset msg5
        call StdOut
        add esp, 4
    ; Simulate default when case value is out of 1-5 range
    .else
        push offset msgDefault
        call StdOut
        add esp, 4
    .endif

    ; Exit
    push 0
    call ExitProcess      

exitProgram:
    ; Exit program
    push 0
    call ExitProcess
_mainCRTStartup ENDP
END

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值