鱼C论坛

 找回密码
 立即注册
查看: 474|回复: 17

[汇编作业] 汇编检测点

[复制链接]
发表于 2024-11-1 15:44:47 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 1518610955 于 2024-11-26 16:20 编辑

个人汇总,到11章为止

汇编检测点2.1如图:

汇编检测点2.1如图:

汇编检测点1.1如图:

汇编检测点1.1如图:

汇编检测点2.2如图:

汇编检测点2.2如图:

汇编检测点2.3如图:

汇编检测点2.3如图:

汇编检测点3.1如图:

汇编检测点3.1如图:

汇编检测点3.2如图:

汇编检测点3.2如图:

汇编检实验四如图:

汇编检实验四如图:

汇编检测点6.1如图:

汇编检测点6.1如图:

汇编检实验四如图(代码在评论区):

汇编检实验四如图(代码在评论区):

汇编检实验六如图(代码在评论区):

汇编检实验六如图(代码在评论区):

汇编检实验七如图(代码在评论区):

汇编检实验七如图(代码在评论区):

汇编检测点9.1如图:

汇编检测点9.1如图:

汇编检测点9.2如图:

汇编检测点9.2如图:

汇编检测点9.3如图:

汇编检测点9.3如图:

汇编检测点10.1如图:

汇编检测点10.1如图:

汇编检测点10.2如图:

汇编检测点10.2如图:

汇编检测点10.3如图:

汇编检测点10.3如图:

汇编检测点10.4如图:

汇编检测点10.4如图:

汇编检测点10.5如图:

汇编检测点10.5如图:

汇编检测点10.5如图:

汇编检测点10.5如图:

汇编检实验十如图(代码在评论区):

汇编检实验十如图(代码在评论区):

汇编检实验10.2如图(代码在评论区):

汇编检实验10.2如图(代码在评论区):

汇编检测点11.1如图:

汇编检测点11.1如图:

汇编检测点11.2如图:

汇编检测点11.2如图:

汇编检测点11.3如图:

汇编检测点11.3如图:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-11-1 15:53:09 From FishC Mobile | 显示全部楼层
不都有答案了吗,几个意思?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-11-1 16:03:14 | 显示全部楼层
jackz007 发表于 2024-11-1 15:53
不都有答案了吗,几个意思?

想做一份自己的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-11-1 16:32:37 | 显示全部楼层
请问您需要关于汇编检测点1.1的具体帮助吗?如果有代码或具体问题,请提供更多信息,我会尽力帮助您。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-11-1 17:44:50 | 显示全部楼层
全是考点
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-11-1 20:42:42 | 显示全部楼层
学习温故知新
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-11-4 09:14:30 | 显示全部楼层
1.1补充
1.8086读取次数:
1024÷(16÷8)=512次,以为一个字节是8位。
2.30386读取次数:
1024÷(32÷8)=256次,以为一个字节是8位。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-11-4 10:16:26 | 显示全部楼层
1518610955 发表于 2024-11-4 09:14
1.1补充
1.8086读取次数:
1024÷(16÷8)=512次,以为一个字节是8位。

2.2补充
给定段地址SA,和上面题目差不多,最大肯定是偏移地址为0,即2000H
若让偏移地址最大,为FFFFH,则结果是10001H,这样前16位是1000H,1会被舍去,所以我们取1001H,这样不至于让偏移地址为最大FFFFH都无法到20000H
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-11-4 10:57:25 | 显示全部楼层
1518610955 发表于 2024-11-4 10:16
2.2补充
给定段地址SA,和上面题目差不多,最大肯定是偏移地址为0,即2000H
若让偏移地址最大,为FFFFH,则 ...

2.3补充
ip每次增加,大小为所执行指令的长度
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-11-6 17:57:03 | 显示全部楼层
实验五补充
(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

so segment
    db 0,0,0,0,0,0,0,0
so ends

code segment

start:  mov ax, a
        mov ds, ax

        mov ax, b
        mov es, ax

        mov ax, so
        mov ss, ax

        mov bx, 0
        mov cx, 8
    s:
        mov ax,ds:[bx]
        mov ss:[bx], ax
        mov ax, es:[bx]
        add ss:[bx], 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
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 bx, 0
        mov ss, ax
        mov sp, 10H

        mov cx, 8
    s:  push [bx]
        add bx,2
        loop s

        mov ax, 4c00H
        int 21H

code ends
end start
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-11-7 16:26:51 | 显示全部楼层
实验六补充
assume cs:codesg,ss:stacksg,ds:datasg

stacksg segment
    dw 0,0,0,0,0,0,0,0
stacksg ends

datasg segment
    db '1. display      '
    db '2. brows        '
    db '3. replace      '
    db '4. modify       '
datasg ends

codesg segment
    
    start:  mov ax, stacksg
            mov ss, ax
            mov sp, 16              ;初始化栈
            mov ax, datasg
            mov ds, ax
            mov bx, 0               ;定义行
            mov cx,4
        s1: push cx
            mov si, 0
            mov cx, 4
        s2: mov al, [bx+3+si]       ;使用al上面定义的数据单元为字节 db 不是 dw 。
            and al, 11011111B
            mov [bx+3+si], al
            inc si
            loop s2
            add bx, 16
            pop cx
            loop s1
            
            mov ax, 4c00H
            int 21H
codesg ends
end start
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-11-8 16:30:07 | 显示全部楼层
实验7补充
assume cs:code, ds:data, ds:table

data segment
        db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
        db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
        db '1993','1994','1995'
        ;以上是表示21年的21个字符串
        dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
        dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
        ;以上是表示21年公司总收入的21个dword型数据
        dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
        dw 11542,14430,15257,17800
        ;以上是表示21年公司雇员人数的21个word型数据
data ends
            
table segment
        db 21 dup ( 'year summ ne ?? ')
table ends

code segment
    start:  mov ax, data
            mov ds, ax
            mov ax, table
            mov es, ax
            mov di, 0
            mov bx, 0
            mov si, 0

            mov cx, 21
      s:    mov ax, ds:[di]
            mov dx, ds:2H[di]
            mov es:[si], ax
            mov es:2H[si], dx           ;yeas

            mov ax, ds:54H[di]
            mov dx, ds:56H[di]
            mov es:5H[si], ax
            mov es:7H[si], dx           ;总工资

            div word ptr ds:0A8H[di]
            mov es:0DH[si], ax          ;平均工资

            mov ax, ds:0A8H[di]
            mov es:0aH[si], ax          ;人数

            add di, 2
            add bx, 4
            add si, 16
            loop s

            mov ax, 4c00H
            int 21H
code ends
end start

设置两个段寄存器,分别指向数据和表,
数据中有类数据,分别记录其第一个数据的相对地址,方便后期寻址idata
数据中,分别以dd,db,dw存放数据,其中db放入字符串,将一个年份数据相当于一个整体,以此设置偏移量,di,si,和寄存器bx,来记录,以此在循环中的正确寻址
最后,按要求循环分别寻址打印即可
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-11-13 14:34:18 | 显示全部楼层
实验9代码
assume cs:code
data segment
        db 'welcome to masm!'
        db 02h,24h,71h  ; 要求的三个颜色对应的16进制代码
data ends

stack segment
        db 16 dup(0)
        ; 也可以是下面的定义法:
        ; dw 8 dup(0)
stack ends

code segment

start:        
                ; 设置data段,以及ds:bx指向data段的第一个单元,
                ; 即ds:[bx]的内容就是data段第一个单元的内容  
                mov ax,data
                mov ds,ax
                
                ;设置显示缓存区段
                mov ax,0b800h ;设置起始缓存
                mov es,ax                
                
                ;设置栈段
                mov ax,stack
                mov ss,ax
                mov sp,10h  ;指向栈顶
                
                ;初始化三个寄存器
                mov bx,780h ; 行 从12-14行(注意:从第1行开始计数)
                mov si,10h ; 颜色的偏移量,三次循环每次
                                        ; 增加 1h 指向下一个颜色
                
                mov cx,3    ; 三次循环改变行
        s:         mov ah,ds:[si] ;颜色事先存放在ah中
                push cx                
                push si
                
                
                mov cx,16  ; 16次循环改变列
                
                mov si,64  ; 这里的si的意义是多少列,
                        ; 为什么从64列开始呢?
                        ; (1)字符串为32字节,16字节ASCLL码,16字节属性
                    ; (2)每一行有160列,那么余下有 160-32=128列为空白
                        ;    要使得字符串居中显示,那么字符串的左边和右边
                        ;          都应该是64字节(128/2),而列数是从0开始计数,
                        ; 所以左边的64字节为0-63,所以这里偏移量为64
                mov di,0  
                                        
        s0:        mov al,ds:[di] ;将date段中的字符一个一个传入es中
                mov es:[bx+si],al ; 低位存放字符
                mov es:[bx+si+1],ah ; 高位存放颜色
                
                add si,2  ;显示缓存区字符ASCII码偏移量为2
                add di,1  ;data段字符的偏移量,每次加 1 
                
                loop s0
                
                pop si  
                pop cx  ;后进先出,先出栈si,再出栈cx
                
                add si,1h  ;指向下一个颜色
                add bx,0a0h ;指向下一行 160=0a0h
                loop s
                
                mov ax,4c00h
                int 21h
code ends

end start
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-11-13 15:57:57 | 显示全部楼层
汇编检测点10.5补充
assume cs:code

stack segment 
        dw 8 dup (0)
stack ends

code segment
start:
        mov ax,stack 
        mov ss,ax
        mov sp,16                                ;空栈
        mov ds,ax                                ;寄存器DS指向栈的段地址
        mov ax,0
        call word ptr ds:[0EH]        
        ;首先执行push IP(下一条inc的偏移地址),此时SP=0EH;再执行jmp word ptr ds:[0EH],目的偏移地址由ds:[0EH]给出
        ;因为DS和SS指向同一片内存,且(SP)=0EH,所以ds:[0EH]相当于栈顶元素IP的值,即(IP)=(IP),程序顺序执行
        inc ax         ;ax=1
        inc ax         ;ax=2
        inc ax         ;ax=3
code ends 


assume cs:code 

data segment
        dw 8 dup (0)
data ends

code segment
start:
        mov ax,data 
        mov ss,ax 
        mov sp,16        ;空栈,大小为16字节
        
        mov word ptr ss:[0], offset s 
        ;将标号s处的偏移地址赋值到ss:[0]中,即栈的第8个字
        mov ss:[2],cs 
        ;将寄存器CS的内容(标号s处的段地址)赋值到ss:[2]中,即栈的第7个字
        call dword ptr ss:[0]
        ;首先执行push CS和push IP(后一指令nop的CS和IP),此时SP=0CH
        ;再执行jmp dword ptr ss:[0],目的地址由ss:[0]高地址(标号s处指令的段地址)给出、偏移地址由ss:[0]低地址(标号s处指令的偏移地址)给出
        ;所以,此时的jmp dword ptr ss:[0]的功能是跳转到标号s处执行
        nop
s:
        mov ax,offset s         ;将标号s处的偏移地址赋值到AX
        sub ax,ss:[0cH]                
        ;ax=ax-ss:[0cH],ss:[0cH]的值为栈顶元素,即nop指令的偏移地址,即s.IP-nop.IP为nop指令长度,即为1
        mov bx,cs         
        sub bx,ss:[0eH]
        ;bx=bx-ss:[0eH],ss:[0eH]的值为第二栈顶元素,即nop指令的段地址,即cs-nop.CS,即为0
code ends 
end start 
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-11-25 16:50:12 | 显示全部楼层
补充汇编实验10:

1. (dh)=行号(0-24取值范围);(dl)=列号(0-79取值范围);(cl)=颜色(是一个二进制排列组合的值);ds:si指向字符串的首地址。

2. 行偏移量为80*2=160    列偏移量为1*2=2 相加得总偏移量

3. 字符显示:字符+属性  字符放低位(cl)|属性放高位(ch)

4.循环打印
assume cs:code

data segment

    db 'Welcome to masm!', 0        ;内存data段中定义一个字符串

data ends

code segment

main:   ;字符串参数

        mov dh, 8           ;屏幕的行数

        mov dl, 3           ;所在行的列数

        mov ch, 0           ;ch清零,防止高8位不为零。

        mov cl, 2           ;颜色属性(此处应是二进制数0000 0010)

       

        mov ax, data

        mov ds, ax

        mov si, 0           ;将ds:si指向字符串

        call show_str

       

        mov ax, 4c00H

        int 21H

    ;show_str功能 :按行和列及字符属性显示字符串  

    ;入口参数:dh-行数、dl-列数、cl-字符属性、ds:[si]指向字符串。

    ;返回值:无

show_str:   push dx

            push cx

            push si             ;将子程序用到的寄存器入栈

           

            mov ax, 0b800H

            mov es, ax          ;设置显示缓冲区内存段

           

            mov ax, 0           ;(ax)= 0,防止高位不为零  

            mov al, 160         ;0a0H-   160字节/行
            
            dec dh

            mul dh              ;相对于0b800:0000第dh行偏移量

            mov bx, ax          ;将第(dh)行的偏移地址送入bx,bx代表行偏移

            mov ax, 0

            mov al, 2           ;列的标准偏移量是2个字节

            mul dl              ;同一行列的偏移量,尽量使用乘法,(al)=列偏移

            add bx, ax          ;最终获得偏移地址(bx)=506H

            mov di,0            ;将di作为每个字符的偏移量

            mov al, cl          ;将字符属性写入al中

            mov ch, 0           ;将cx高8位设置为0

           

    show:   mov cl, ds:[si]     ;将字符串单个字符读入cl中

            jcxz ok             ;判断字符串是否为零。

            mov es:[bx+di+0], cl    ;在显示缓冲区中写入字符

            mov es:[bx+di+1], al    ;在显示缓冲区中写入字符属性

            add di, 2

            inc si

            jmp short show

   

        ok: pop si              ;字符串字符为0,结尾

            pop dx

            pop cx              ;恢复寄存器

            ret

   

code ends

end main
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-11-25 17:21:04 | 显示全部楼层
汇编检实验10.2补充:
1.明白div的运算后商和余数放置位置

2.利用栈保存低位数值,先运算高位,用bx暂存高位商

3.全部取出,放入对应的寄存器中
assume cs:code
code segment
start:

        mov ax, 4240H       ;被除数,低16位
        mov dx, 000FH       ;被除数,高16位
        mov cx, 0AH         ;除数
        
        call divdw          ;调用divdw子程序,做不溢出的除法运算。
 
        mov ax, 4c00H
        int 21H

divdw:                      ;子程序开始

        push ax             ;将被除数低16位先压栈保存。
        mov ax, dx          ;(ax)=(dx)
        mov dx, 0000H       ;初始化
        div cx              ;此时(dx)=0000H,(ax)=000FH,组合成0000000FH。
        mov bx, ax          ;将H/N结果的商先保存在bx中,(bx)=0001H

        pop ax              ;将L值弹栈到ax
        div cx              ;此时(dx)=0005H,(ax)=4240H,组合成54240H

        mov cx, dx          ;返回值(cx)等于最终结果的余数
        mov dx, bx          ;最终结果高16位值=(bx)
            
            ret

code ends
end start  
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-11-26 10:56:39 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-11-28 17:07:38 | 显示全部楼层
jackz007 发表于 2024-11-1 15:53
不都有答案了吗,几个意思?

感谢哥10.5一直看不懂,第一个为什么ip为什么是oe怎么来的啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-21 21:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表