这学期结束了汇编的学习,光看书听老师讲是没有太大提高的。这里整理了一些代码,提供参考,也是我对汇编学习的总结。
软件下载(百度盘):https://pan.baidu.com/s/1RTCBPFrJjSsuUKsI2ku-Gg
提取码:9876
data segment
str DB 'Hello world!','$' ;调用ah的9号功能将dx中的内容输出,以‘$’结束
data ends
code segment
assume cs:code,ds:data
run:
;输出hello world!
mov ax,data
mov ds,ax ;初始化ds段
mov dx,offset str
mov ah,09h ;调用9号功能
int 21h
mov ah,4ch
int 21h
code ends
end run
data segment
str DB '1234567891' ;统计'1'的个数
num DB 0 ;num用来记录有几个‘1’
data ends
code segment
assume cs:code,ds:data
run:
mov ax,data
mov ds,ax
mov cx,offset num-offset str ;用num的偏移地址减去str的偏移地址,以此来确定应该循环多少次
;shr cx,1
lea si,str ;取str的偏移地址
s: ;每以此执行完loop语句,cx的值自减1,由程序自己决定
mov al,[si] ;将si指向的偏移地址的内容传送到al中
mov bl,al
sub al,49 ;ax = ax - 49,因为‘1’对应的ASCII码是49,这里通过ASCII码来判断它是否为‘1’
cmp al,0 ;和零作比较
jne next ;不等时,执行该语句后inc num是不会被执行的,所以以此方式来统计‘1’的个数
inc num ;否则num自加一次
next:
inc si
loop s
hlt
code ends
end run
data segment 'data'
s DW 10
x DW 2
y DW 1
z DW 19
data ends
code segment 'code'
assume cs:code
run:
;计算这个式子(s-(x*y+z))/x
mov ax,data
mov ds,ax
mov ax,x
mul y ;ax = x * y
mov bx,z
add ax,bx ; ax = bx + ax
mov bx,s
sub bx,ax ;bx = bx - ax
cmp bx,0 ;与0作比较
jge next ;如果大于等于0则跳转到next
neg bx ;否则求补
next:
mov ax,bx
div x ;al = ax / x(取整) dx = ax % x(取余)
hlt
code ends
end run
;DB (Declare Byte) 用于声明字节数据(8位)
;DW(Declare Word)用于声明字数据(16位)
;DD(Declare Double Word)用于声明双字(两个字)数据,
;DQ(Declare Quad Word)用于声明四字数据。data segment 'data'
sum db 0
data ends
code segment 'code'
assume cs:code,ds:data
run:
;计算5的阶乘
mov ax,data
mov ds,ax
mov cx,5
mov ax,1
s:
mul cx ;al = al * cx
loop s
hlt ;结果结果存放在ax中
code ends
end run
data segment
table DB 48,52,50,57,49,255,154,223,55,53
max DB 0
data ends
code segment
assume cs:code,ds:data
run: ;寻找最大值
mov ax,data
mov ds,ax
mov cx,10 ;准备循环10次
mov ax,0000h
mov bx,0000h ;bx初始化为0
mov si,offset table
s:
mov al,[si] ;读取一个table中的数据
cmp bl,al ;bl - al
JAE next ;针对无符号数时:高于等于转移到next处执行
mov bl,al
next: ;这个next是标号,可以随意写
inc si ;如果JAE next没有被执行,但是这个next依然会被按照顺序执行一次,这一点很重要!!
loop s ;loop语句结束,循环几次是由cx来决定的
mov max,bl
hlt ;停止运行
code ends
end run
END
祝大家学习愉快!