跳转至

汇编学习

QWQ

作者已经在更新了.....

GAS
1
2
3
4
5
dw 字=2字节 ax  ;存储方式不同
db 字节 al
段寄存器: cs ds ss es
偏移地址寄存器:ip bp  -> ss
si , di , dx ->ds ;这个很重要

常见jmp指令

GAS
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
;无符号数
JBJump if Below):如果无符号数小于(below)某个值,则跳转。它通常用于无符号整数的比较后,当标志寄存器中的进位标志(CF, Carry Flag)被设置时发生跳转。
JAJump if Above):如果无符号数大于(above)某个值,则跳转。这同样适用于无符号数比较的情况,当进位标志(CF)和零标志(ZF, Zero Flag)都未被设置时发生跳转。
----------------------------------------------------------------------------------------------------
;有符号数
JGJump if Greater):如果有符号数大于(greater)某个值,则跳转。用于有符号整数的比较,当零标志(ZF)为0且溢出标志(OF, Overflow Flag)等于符号标志(SF, Sign Flag)时发生跳转。
JLJump if Less):如果有符号数小于(less)某个值,则跳转。这也用于有符号数比较,当溢出标志(OF)不等于符号标志(SF)时发生跳转。
----------------------------------------------------------------------------------------------------
JE/JZJump if Equal/Jump if Zero):如果相等或结果为零则跳转。当零标志(ZF)被设置时发生跳转。
JNE/JNZJump if Not Equal/Jump if Not Zero):如果不相等或结果不为零则跳转。当零标志(ZF)未被设置时发生跳转。
JBE/JNAJump if Below or Equal/Jump if Not Above):如果低于或等于(无符号数)则跳转。当进位标志(CF)或零标志(ZF)被设置时发生跳转。
JA/JNBEJump if Above/Jump if Not Below or Equal):如果高于(无符号数)则跳转。当进位标志(CF)和零标志(ZF)都未被设置时发生跳转。
JGE/JNLJump if Greater or Equal/Jump if Not Less):如果有符号数大于或等于则跳转。当符号标志(SF)等于溢出标志(OF)时发生跳转。
JL/JNGEJump if Less/Jump if Not Greater or Equal):如果有符号数小于则跳转。当符号标志(SF)不等于溢出标志(OF)时发生跳转。
JLE/JNGJump if Less or Equal/Jump if Not Greater):如果有符号数小于或等于则跳转。当零标志(ZF)被设置或者符号标志(SF)不等于溢出标志(OF)时发生跳转。
JGE/JNLJump if Greater or Equal/Jump if Not Less):如果有符号数大于或等于则跳转。当符号标志(SF)等于溢出标志(OF)时发生跳转。

考试程序

buff1 和buff2进行,各个位置相加,不考虑溢出,完成对应项的求和保存在sum中

GAS
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
data segement
    buff1 db -1,2,32,342.....
    buff2 db  -1,3,3,4,5,5,6.....
    sum  db 10dup(0)
data ends
-------------------------------------
code segement
main proc far
    assume ds:data cs:code
-------------------------------------
start:
    push dx
    sub ax,ax  ; ax清零
    push ax
    mov ax,data
    mov ds,ax
    lea si, buff1
    lea di, buff2
    lea bx,sum    ; 用来存放sum的值
    mov cx,10  ; 设置循环次数
next:
    mov al,[si]
    add al,[di]
    mov [bx],al
    inc si
    inc di
    inc bx
    loop next 
    ret 
    main endp
code ends
end main
加密程序
GAS
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
data segement
    str db "dkfjaklflalf121"  ; 总共二十个字符
data ends
code segement
main proc far 
    assume ds:data,cs:code
start:
    push dx
    sub ax,ax
    push ax
    # mov ax,data
    # mov ds,ax
    lea si,str
    mov cx,20 ;设置循环次数
    call jiami ; call function
    ret 
    main endp
    ;加密子程序
jiami proc near
     l1: cmp [si],'A'
         jb l2
         cmp [si],'Z'
         ja l3
         add byte ptr [si],20H
         jmp l4
     l2:
         add byte ptr [si],1
         jmp l4
     l3:
         sub byte ptr  [si],20H
     l4:    
         inc si
         loop l1
         ret
     jiami endp
     code  ends
        end main
Text Only
1
2
3
4
5
6
7
数字的十六进制是 0-9  
30h-39h
小写字母的十六进制是 a-z
61h-7ah
大写字母的十六进制是 A-Z
41h-5ah
小写转大写字母:sub byte ptr  [si],20H
GAS
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
data segement
    temp dw 1,2,2,  ...;31个数据
    days dw 31
    temp dw ? 
data ends
code segement
    main proc far
        assume: ds : data , cs:code
    start:
        mov ax,data
        mov ds,ax

        sub ax,ax
        sub si,si
        mov cs,days

    sum_loop:
        add ax,temp[si]
        add si,2
        loop sum_loop

        mov bx,days
        sub dx,dx
        div bx
        mov ave ax

        mov ah,4ch
        int 21h
    code ends
    end main
GAS
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
data segement
    input_msg db 'enter command'
    invalid_msg db 'invalid input'
data ends
code segement
    main porc far
    assume: ds:data,cs:code
    start:
        mov ax,data
        mov ds,ax

    main_loop:
        ;显示提示信息
        mov ah,09h
        lea dx,input_msg
        int 21h
        ;获取键盘输入
        mov ah,01h
        int 21h

        ;检查输入并跳转到相应处理位置
        cmp al,'1'
        je forward
        cpm al,'2'
        je backward
        cpm al,'0'
        je stop

    forward:
        call movfore
        jmp main_loop
    backward:
        call moveback
        jmp main_loop
     .........