汇编语言实验九

汇编作业之实验九

实验一

补全程序 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写博客园,有很好的体验。

posted @ 2018-12-14 01:52  Jaden233  阅读(536)  评论(1编辑  收藏  举报