汇编学习

神州天下 2011-07-07 10:06:38
加精
都说不学汇编就很难有大成就,虽说是有些底层但精通汇编还是少之甚少,希望自己能学会它吧,也能更好的学高级语言,为java打好更深理解的基础。并希望汇编高手支持帮助!真正感兴趣的可以组织到一块学习的,相信团队的力量能帮助我们奠定坚实基础!
《1》、实现绕圈的笑脸:



assume cs:code
code segment
dec dh
dec dl
inc dh
inc dl ;预存指令
start: mov ax,cs
mov ds,ax
mov si,0
lea di,s1 ;使ds:si指向预存指令,ds:di指向目的地址
mov dx,0h ;光标起始坐标0,0
s:mov ah,2
mov bh,0
int 10h ;调用int 10h第2号中断,置光标
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
mov ah,0ah ;int 10h第0a号中断
mov al,2 ;显示笑脸
mov bh,0 ;第0页
mov cx,1 ;重复次数1
int 10h
call delay ;延迟显示
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
mov ah,0ah ;用int 10h 0a号中断清除笑脸
mov al,0
mov bh,0
int 10h
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

cmp dh,24 ;行号是否为24
jb L ;小于则转 L
mov ax,[si] ;等于则改s1处为自减
mov [di],ax
L2:cmp dl,79 ;列号是否为79
jb L1 ;小于则转 L1
mov ax,[si+2] ;等于,改si+2处为自减
mov [di+2],ax
jmp s1
L:cmp dh,0 ;行号是否为0
ja L2 ;大于0转L2
mov ax,[si+4] ;为0 ,改s1处为自加
mov [di],ax
jmp L2
L1:cmp dl,0 ;列号是否为0
ja s1 ;大于转 s1
mov ax,[si+6] ;等于改 s1+2处 自加
mov [di+2],ax
s1:inc dh
inc dl
jmp s
mov ax,4c00h
int 21h
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
delay:push ax
push dx
mov dx,2000h
mov ax,0
s3: sub ax,1
sbb dx,0
cmp ax,0
jne s3
cmp dx,0
jne s3
pop dx
pop ax
ret
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
code ends
end start
改进一下的【加中断可控制了】:
assume cs:code
code segment
dec dh
dec dl
inc dh
inc dl ;预存指令
start: mov ax,cs
mov ds,ax
mov si,0
lea di,s1 ;使ds:si指向预存指令,ds:di指向目的地址
mov dx,0h ;光标起始坐标0,0
s:mov ah,2
mov bh,0
int 10h ;调用int 10h第2号中断,置光标
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
mov ah,0ah ;int 10h第0a号中断
mov al,2 ;显示笑脸
mov bh,0 ;第0页
mov cx,1 ;重复次数1
int 10h
call delay ;延迟显示
in al,60H
cmp al,10H
jz over

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
mov ah,0ah ;用int 10h 0a号中断清除笑脸
mov al,0
mov bh,0
int 10h
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

cmp dh,24 ;行号是否为24
jb L ;小于则转 L
mov ax,[si] ;等于则改s1处为自减
mov [di],ax
L2:cmp dl,79 ;列号是否为79
jb L1 ;小于则转 L1
mov ax,[si+2] ;等于,改si+2处为自减
mov [di+2],ax
jmp s1
L:cmp dh,0 ;行号是否为0
ja L2 ;大于0转L2
mov ax,[si+4] ;为0 ,改s1处为自加
mov [di],ax
jmp L2
L1:cmp dl,0 ;列号是否为0
ja s1 ;大于转 s1
mov ax,[si+6] ;等于改 s1+2处 自加
mov [di+2],ax
s1:inc dh
inc dl
jmp s
over: mov ax,4c00h
int 21h
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
delay:push ax
push dx
mov dx,500h
mov ax,0
s3: sub ax,1
sbb dx,0
cmp ax,0
jne s3
cmp dx,0
jne s3
pop dx
pop ax
ret
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
code ends
end start
《2》、像素颜色
;子程序display入口参数
;cx列号
;dx行号
;al像素颜色
;子程序delay延时
stack segment stack
db 100h dup(?)
stack ends
code segment
assume cs:code,ds:code,ss:stack
start:
xor ax,ax ;设置显示模式(640*480 16色图形)
mov ah,0
mov al,12h
int 10h
mov ah,0bh ;置调色板背景色
mov bh,0
mov bl,0
int 10h
mov cx,0
mov dx,0
mov al,0
s2:call display
call delay
inc al
cmp al,10h
je exit
add cx,10
jmp s2
exit: mov ah,01
int 21h ;esc退出观看效果
cmp al,1bh
jne exit
mov ax,0003h
int 10h
mov ax,4c00h
int 21h
display:push ax
push bx
push si
mov bx,cx
mov si,cx
add si,10
s: mov ah,0ch
int 10h
inc cx
cmp cx,si
jne s
mov cx,bx
inc dx
cmp dx,10
jne s
mov dx,0
pop si
pop bx
pop ax
ret
delay:push ax
push dx
mov dx,2000h
mov ax,0
s1:sub ax,1
sbb dx,0
cmp ax,0
jne s1
cmp dx,0
jne s1
pop dx
pop ax
ret
code ends
end start
《3》进制转换:

(1)16转10进制:
TITLE CONVERT HEXADECIMAL TO BCD
DATA SEGMENT
PROMPT DB 'Hello Boss! INPUT sixten bits number ,please :$'
HEXBUF DB 3,0,3 DUP(0)
DISP DB 0AH,0DH
BCDBUF DB 6 DUP(0),'$'
DATA ENDS
STACK1 SEGMENT PARA STACK
DW 20H DUP(0)
STACK1 ENDS
COSEG SEGMENT
ASSUME CS:COSEG,DS:DATA,SS:STACK1
HEXBCD: MOV AX,DATA
MOV DS,AX
LEA DX,PROMPT
MOV AH,09H
INT 21H
LEA DX,HEXBUF
MOV AH,0AH
INT 21H
LEA SI,HEXBUF+2
MOV BX,0
MOV CH,HEXBUF+1
HEX1: MOV AL,[SI]
CMP AL,'9'
JBE NUMB
SUB AL,07H
NUMB: AND AL,0FH
MOV CL,04
SAL BX,CL
OR BL,AL
INC SI
DEC CH
JNE HEX1
MOV WORD PTR BCDBUF+0,0
MOV WORD PTR BCDBUF+2,0
MOV WORD PTR BCDBUF+4,0

TEST BX,8000H
JNS PLUS
MOV BCDBUF,'-'
NEG BX
PLUS: MOV CH,0FH
LOP0: CLC
SHL BX,1
CALL ADDIT
CALL MULTI
DEC CH
JNE LOP0
SHL BX,1
CALL ADDIT


LEA DI,BCDBUF+1
MOV CX,3
LOP1: OR BYTE PTR [DI],30H
INC DI
LOOP LOP1

LEA DX,DISP
MOV AH,09H
INT 21H

MOV AH,4CH
INT 21H

ADDIT PROC
LEA DI,BCDBUF+3
MOV CL,3
ADD1: MOV AL,[DI]

ADC AL,0
AAA
MOV [DI],AL
DEC DI
DEC CL
JNE ADD1
RET
ADDIT ENDP
MULTI PROC
LEA DI,BCDBUF+3
MOV CL,3
CLC
MUL1: MOV AL,[DI]
ADC AL,AL
AAA
MOV [DI],AL
DEC DI
DEC CL
JNE MUL1
RET
MULTI ENDP
COSEG ENDS
END HEXBCD

(2)十转十六进制:

TITLE ADDITION
DATA SEGMENT
A1 DB "Input a number please: ","$"
A2 DB 0DH,0AH,"The result is: ","$"
DATA ENDS
STACK1 SEGMENT PARA STACK
DW 20H DUP(?)
STACK1 ENDS
COSEG SEGMENT
ASSUME CS:COSEG,DS:DATA,SS:STACK1
START: MOV AX,DATA
MOV DS,AX

MOV DX,OFFSET A1
MOV AH,9
INT 21H

MOV AH,01H
INT 21H

AND AL,0FH
SUB AH,AH
ADD BX,AX

MOV AH,01H
INT 21H

CMP AL,0DH
JE ERR1

MOV DX,BX
MOV CL,3
SAL BX,CL
ADD BX,DX
ADD BX,DX

AND AL,0FH
SUB AH,AH
ADD BX,AX

ERR1: MOV DX,OFFSET A2
MOV AH,9
INT 21H

SUB AX,AX
MOV CH,4
ERR2: MOV CL,4
ROL BX,CL
MOV AL,BL
AND AL,0FH
ADD AL,30H
CMP AL,3AH
JB ERR3
ADD AL,07H
ERR3: MOV DL,AL
MOV AH,2
INT 21H
DEC CH
JNZ ERR2

MOV AH,4CH
INT 21H
COSEG ENDS
END START

















...全文
20727 457 打赏 收藏 转发到动态 举报
写回复
用AI写文章
457 条回复
切换为时间正序
请发表友善的回复…
发表回复
f22527259 2014-03-11
  • 打赏
  • 举报
回复
不错,学习了,感谢楼主!
wxyb 2014-03-10
  • 打赏
  • 举报
回复
顶一下吧!0.0.0.0
云淡天 2014-03-07
  • 打赏
  • 举报
回复
好东西,学习了
8YZ08 2014-01-06
  • 打赏
  • 举报
回复
谢谢分享,先收藏了
z2m51 2014-01-06
  • 打赏
  • 举报
回复
学习了,牛逼哄哄
jue230103 2013-12-26
  • 打赏
  • 举报
回复
天书啊 完全看不懂
MaxDaha 2013-12-26
  • 打赏
  • 举报
回复
值得学习,推荐一下
幽冥共舞 2013-12-13
  • 打赏
  • 举报
回复
简直就是天书
Crank_JASON 2013-12-08
  • 打赏
  • 举报
回复
刚学,表示不明觉厉
SensesAround 2013-11-25
  • 打赏
  • 举报
回复
好晕阿,最近准备考汇编,哎。
kaven4 2013-11-25
  • 打赏
  • 举报
回复
汇编还是很有用的
vincent_fang 2013-11-25
  • 打赏
  • 举报
回复
正在学习中,谢谢LZ分享
u012436959 2013-10-15
  • 打赏
  • 举报
回复
看来,得多努力点,学点汇编!
Error400004 2013-09-30
  • 打赏
  • 举报
回复
天书
Bairrfhoinn 2013-09-29
  • 打赏
  • 举报
回复
代码太乱了,就不能用下代码高亮把它格式化壹下嘛?
轻纱细雨 2013-09-27
  • 打赏
  • 举报
回复
看不懂呢,有点复杂
wtc0272 2013-09-24
  • 打赏
  • 举报
回复
汇编真的有点难,学习了。。
奇典 2013-09-17
  • 打赏
  • 举报
回复
不错收藏了...
fzfocus 2013-09-15
  • 打赏
  • 举报
回复
汇编学好了,可以做许多底层工作。
afcaa 2013-08-28
  • 打赏
  • 举报
回复
看看!!!!!!!!!!!
加载更多回复(437)

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧