汇编语言实验九
汇编作业之实验九
实验一
补全程序 t1.asm,完成在屏幕上输出内存单元中的十进制两位数
; 在屏幕上输出内存单元中的十进制两位数
assume cs:code, ds:data
data segment
db 12
db 0,0 ; 前一个字节用于保存商,后一个字节用于保存余数
data ends
code segment
start:
mov ax,data
mov ds,ax ; 补全指令,使得ds <-- data段地址
mov ah,0
mov al,ds:[0] ; ax <-- data段字节单元的被除数12
mov bl,10
div bl
mov ds:[1],al ; 补全代码,让商保存到data段注释中指定的单元
mov ds:[2],ah ; 补全代码,让余数保存到data段注释中指定的单元
mov ah,2
mov dl,ds:[1] ; 补全代码,使得dl <-- data段中保存的商的字节单元数值
add dl,30h; 补全代码,使得dl中的数值转换为数字字符
int 21h
mov ah,2
mov dl,ds:[2] ; 补全代码,使得dl <-- data段中保存余数的字节单元数值
add dl,30h; 补全代码,使得dl中的数值转换为数字字符
int 21h
mov ax,4c00h
int 21h
code ends
end start
附上代码在dosbox中的截图——
一点说明:用dosbox直接打开t1.asm时中文会出现乱码,因此一旁用vim编辑器打开了t1.asm,下同。
编译->链接->运行->截图
出现了错误——
额。。。细节问题,应该是link t1.obj或者link t1
。
结果成功运行。
实验二
补全程序t2.asm,完成在屏幕上输出 data 段定义的 5 个十进制两位数,数据和数据之间以空格间隔。
assume cs:code, ds:data
data segment
db 12,35,96,55,67
data ends
code segment
start:mov ax,data
mov ds,ax
mov cx,5
mov bp,0
s:mov ah,0
mov al,ds:[bp]
mov bl,10
div bl
mov ds:[5+bp],al
mov ds:[6+bp],ah
mov ah,2
mov dl,ds:[5+bp]
add dl,30h
int 21h
mov ah,2
mov dl,ds:[6+bp]
add dl,30h
int 21h
mov ah,2
mov dl,20h
int 21h
inc bp
loop s
mov ax,4c00h
int 21h
code ends
end start
截图如图——
代码都在上面,思路很简单,和第一题一样。循环五次用loop循环做就可以了,其中用到了第七章所学的寻址方式,loop循环当然还有div指令。运行结果如下图所示:
实验三
编程:分别在屏幕中间分别显示,绿色、绿底红字、白底蓝字的字符串'welcome to masm!'
根据老师的提示我先在debug环境中做了简单的实验,希望找到屏幕中间的显存位置,验证猜想。如图——
我对中间位置的想法是这样的一共25行,(25-3)/2所以中间行为11、12、13老师在辅助文档也标出了。那么中间位置在哪里呢。(160-32)/2=64也就是40h,那么很容易了,三行岂止分别是0720h,07c0h,0860h,之后所有代码如下——
; p187 实验9
assume ds:data, cs:code
data segment
db 'welcome to masm!'
db 2H,24H,71H ;字符串属性值
data ends
code segment
start: mov ax,data
mov ds,ax ;字符串及属性值所在段的段地址送入ds
mov ax,0b800H
mov es,ax ;80×25彩色字符模式显示缓冲区段地址送入es
mov cx,10h
mov bx,0
mov si,0
s0:mov ax,[bx]
mov es:[0720h+si+bx],ax
mov al,2h
mov byte ptr es:[0721h+si+bx],al
inc bx
inc si
loop s0
mov cx,10h
mov bx,0
mov si,0
s1:mov ax,[bx]
mov es:[07c0h+si+bx],ax
mov al,24h
mov byte ptr es:[07c1h+si+bx],al
inc bx
inc si
loop s1
mov cx,10h
mov bx,0
mov si,0
s2:mov ax,[bx]
mov es:[0860h+si+bx],ax
mov al,71h
mov byte ptr es:[0861h+si+bx],al
inc bx
inc si
loop s2
mov ax,4c00h
int 21h
code ends
end start
结果输出截图——
实验中发生了一则错误,在s2循环中我忘记设置了cx的值出现乱码,效果不错,故截了图——
内容感想
汇编语言的学习一直处于迷茫期,说白了不知道学习了什么东西,经历了自己一星期的梳理与整理,开始对汇编有了更深的理解,其实汇编并不难,和高级编程语言比起来,他有自己的风格,有时候会觉得是一种不一样的思路,汇编更多的关注点(个人的感觉)在操作地址上,直接关注的地址、内存,不同地址存储不同的信息,发挥不同的作用,在地址的跳转中,得到我们想要的东西,对细节的关注度更高,字节和字有时候就不能混起来,要用byte ptr等去加上前缀。通过汇编语言的学习使我对高级语言中的指针有了更深的理解,为什么需要指针,就是为了对地址的控制,让编程变得更加直接。第一次使用markdown写博客园,有很好的体验。