汇编学习
| GAS |
|---|
| 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 | ;无符号数
JB(Jump if Below):如果无符号数小于(below)某个值,则跳转。它通常用于无符号整数的比较后,当标志寄存器中的进位标志(CF, Carry Flag)被设置时发生跳转。
JA(Jump if Above):如果无符号数大于(above)某个值,则跳转。这同样适用于无符号数比较的情况,当进位标志(CF)和零标志(ZF, Zero Flag)都未被设置时发生跳转。
----------------------------------------------------------------------------------------------------
;有符号数
JG(Jump if Greater):如果有符号数大于(greater)某个值,则跳转。用于有符号整数的比较,当零标志(ZF)为0且溢出标志(OF, Overflow Flag)等于符号标志(SF, Sign Flag)时发生跳转。
JL(Jump if Less):如果有符号数小于(less)某个值,则跳转。这也用于有符号数比较,当溢出标志(OF)不等于符号标志(SF)时发生跳转。
----------------------------------------------------------------------------------------------------
JE/JZ(Jump if Equal/Jump if Zero):如果相等或结果为零则跳转。当零标志(ZF)被设置时发生跳转。
JNE/JNZ(Jump if Not Equal/Jump if Not Zero):如果不相等或结果不为零则跳转。当零标志(ZF)未被设置时发生跳转。
JBE/JNA(Jump if Below or Equal/Jump if Not Above):如果低于或等于(无符号数)则跳转。当进位标志(CF)或零标志(ZF)被设置时发生跳转。
JA/JNBE(Jump if Above/Jump if Not Below or Equal):如果高于(无符号数)则跳转。当进位标志(CF)和零标志(ZF)都未被设置时发生跳转。
JGE/JNL(Jump if Greater or Equal/Jump if Not Less):如果有符号数大于或等于则跳转。当符号标志(SF)等于溢出标志(OF)时发生跳转。
JL/JNGE(Jump if Less/Jump if Not Greater or Equal):如果有符号数小于则跳转。当符号标志(SF)不等于溢出标志(OF)时发生跳转。
JLE/JNG(Jump if Less or Equal/Jump if Not Greater):如果有符号数小于或等于则跳转。当零标志(ZF)被设置或者符号标志(SF)不等于溢出标志(OF)时发生跳转。
JGE/JNL(Jump 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 |
|---|
| 数字的十六进制是 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
.........
|