汇编网首页登录博客注册
mr_crbn的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
学习动态
好友圈
文章收藏

[2019-07-12 17:03] 汇编语言实验五

【1】
assume  cs:code,ds:data,ss:stack
data segment
    dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h        
data ends
stack segment
    dw 0,0,0,0,0,0,0,0
stack ends
code segment
start: mov ax,stack
mov ss,ax
mov sp,16
mov ax,data 
mov ds,ax
push ds:[0]
push ds:[2]
pop ds:[2]
pop ds:[0]
mov ax,4c00h
int 21h
code ends
end start
 (1) data 的数据并没有 发生改变
 (2) cs=076c  ss=076b   ds=076a 
 (3) data的段地址为x-2    stack的段地址为x-1

【2】
assume  cs:code,ds:data,ss:stack
data segment
    dw 0123h,0456h
data ends
stack segment
    dw 0,0
stack ends
code segment
start: mov ax,stack
mov ss,ax
mov sp,16t
mov ax,data 
mov ds,ax
push ds:[0]
push ds:[2]
pop ds:[2]
pop ds:[0]
mov ax,4c00h
int 21h
code ends
end start

 (1) data 的数据并没有 发生改变
 (2) cs=076c  ss=076b   ds=076a 
 (3) data的段地址为x-2   stack的段地址为x-1  
  (4) (n/16+1)*16  /并非除法而是取整数  因为一段数据的大小为16个字节  那么短地址开始都为16的倍数不满16的按照16个字节的段来计算超过16比如17就需要两个数据段32保证为16的倍数

【3】
assume  cs:code,ds:data,ss:stack

code segment
start: mov ax,stack
mov ss,ax
mov sp,16t
mov ax,data 
mov ds,ax
push ds:[0]
push ds:[2]
pop ds:[2]
pop ds:[0]
mov ax,4c00h
int 21h
code ends

data segment
    dw 0123h,0456h
data ends
stack segment
    dw 0,0
stack ends

end start
 (1) data 的数据并没有 发生改变
 (2) cs=076a  ss=076e   ds=076d
 (3) data的段地址为x+3   stack的段地址为x+4  
 (4) 程序3可以正确运行,因为程序是由上往下运行的 程序1,2 如果没有start 程序就会从数据段开始运行 而程勋3不同,因为 指令在数据段之前 所以去掉start 依旧是指令运行在先。
 (5)  
assume cs:code
a segment
  db 1,2,3,4,5,6,7,8
a ends
b segment
  db 1,2,3,4,5,6,7,8
b ends
c segment
  db 0,0,0,0,0,0,0,0
c ends
code segment
start:mov bx,0
mov ax,a
mov ds,ax
mov cx,8 
       s: mov ax,ds:[bx]
              add ax,ds:[bx+16] 
          mov ds:[bx+32],ax
                  inc bx
                  loop s
mov ax,4c00h
int 21h
code ends
end start
(6)


assume cs:code
a segment
  dw 1,2,3,4,5,6,7,8,9,0ah,0bh,0ch,0dh,0eh,0fh,0ffh
a ends
b segment
  dw 0,0,0,0,0,0,0,0
b ends
code segment

start: mov ax,a
mov ds,ax
mov ax,b
mov ss,ax
mov ax,16
mov sp,ax
mov bx,0
mov cx,8
s:mov ax,ds:[bx]
    push ax
        inc bx
        inc bx
        loop s
mov ax,4c00h
int 21h
code ends
end start

最开始代码段a我以为是一个数据一字节 因为一个代码段为16的倍数 那么 1到ff刚好 所以我以为这只占16个字节
但是实际测试,占了32个字节 正好 对应了前面的公式 (n/16+1)*16
评论次数(1)  |  浏览次数(440)  |  类型(汇编作业) |  收藏此文  | 

[  mr_crbn   发表于  2019-07-12 19:25  ]

第3题的第五小题 用到了 [bx+32]  
我是实际测试过了 可以用的 就用了 其实不用这种方法 我也算出来了 首先要把 a,c的段地址 存入ds,ss里面这里的ss不用做栈 用作段地址 循环之后再把b,的段地址存入ds 太繁琐了 所以我还是用了[bx+32]的方法,看到第七章也有讲。

 
 请输入验证码  (提示:点击验证码输入框,以获取验证码