鱼C论坛

 找回密码
 立即注册
查看: 866|回复: 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如图:
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-11-1 15:53:09 From FishC Mobile | 显示全部楼层
不都有答案了吗,几个意思?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

想做一份自己的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-11-1 17:44:50 | 显示全部楼层
全是考点
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-11-1 20:42:42 | 显示全部楼层
学习温故知新
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-11-4 09:14:30 | 显示全部楼层
1.1补充
1.8086读取次数:
1024÷(16÷8)=512次,以为一个字节是8位。
2.30386读取次数:
1024÷(32÷8)=256次,以为一个字节是8位。
小甲鱼最新课程 -> https://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
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

2.3补充
ip每次增加,大小为所执行指令的长度
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-11-6 17:57:03 | 显示全部楼层
实验五补充
(5)
  1. assume cs:code

  2. a segment
  3.     db 1,2,3,4,5,6,7,8
  4. a ends

  5. b segment
  6.     db 1,2,3,4,5,6,7,8
  7. b ends

  8. so segment
  9.     db 0,0,0,0,0,0,0,0
  10. so ends

  11. code segment

  12. start:  mov ax, a
  13.         mov ds, ax

  14.         mov ax, b
  15.         mov es, ax

  16.         mov ax, so
  17.         mov ss, ax

  18.         mov bx, 0
  19.         mov cx, 8
  20.     s:
  21.         mov ax,ds:[bx]
  22.         mov ss:[bx], ax
  23.         mov ax, es:[bx]
  24.         add ss:[bx], ax
  25.         inc bx
  26.         loop s

  27.         mov ax, 4c00H
  28.         int 21H

  29.     code ends

  30. end start
复制代码


(6)

  1. assume cs: code

  2. a segment
  3.     dw 1,2,3,4,5,6,7,8
  4. a ends

  5. b segment
  6.     dw 0,0,0,0,0,0,0,0
  7. b ends

  8. code segment

  9. start:  mov ax,a
  10.         mov ds, ax

  11.         mov ax, b
  12.         mov bx, 0
  13.         mov ss, ax
  14.         mov sp, 10H

  15.         mov cx, 8
  16.     s:  push [bx]
  17.         add bx,2
  18.         loop s

  19.         mov ax, 4c00H
  20.         int 21H

  21. code ends
  22. end start


复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

  2. stacksg segment
  3.     dw 0,0,0,0,0,0,0,0
  4. stacksg ends

  5. datasg segment
  6.     db '1. display      '
  7.     db '2. brows        '
  8.     db '3. replace      '
  9.     db '4. modify       '
  10. datasg ends

  11. codesg segment
  12.    
  13.     start:  mov ax, stacksg
  14.             mov ss, ax
  15.             mov sp, 16              ;初始化栈
  16.             mov ax, datasg
  17.             mov ds, ax
  18.             mov bx, 0               ;定义行
  19.             mov cx,4
  20.         s1: push cx
  21.             mov si, 0
  22.             mov cx, 4
  23.         s2: mov al, [bx+3+si]       ;使用al上面定义的数据单元为字节 db 不是 dw 。
  24.             and al, 11011111B
  25.             mov [bx+3+si], al
  26.             inc si
  27.             loop s2
  28.             add bx, 16
  29.             pop cx
  30.             loop s1
  31.             
  32.             mov ax, 4c00H
  33.             int 21H
  34. codesg ends
  35. end start
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

  18. code segment
  19.     start:  mov ax, data
  20.             mov ds, ax
  21.             mov ax, table
  22.             mov es, ax
  23.             mov di, 0
  24.             mov bx, 0
  25.             mov si, 0

  26.             mov cx, 21
  27.       s:    mov ax, ds:[di]
  28.             mov dx, ds:2H[di]
  29.             mov es:[si], ax
  30.             mov es:2H[si], dx           ;yeas

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

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

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

  39.             add di, 2
  40.             add bx, 4
  41.             add si, 16
  42.             loop s

  43.             mov ax, 4c00H
  44.             int 21H
  45. code ends
  46. end start
复制代码


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

使用道具 举报

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

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

  11. code segment

  12. start:       
  13.                 ; 设置data段,以及ds:bx指向data段的第一个单元,
  14.                 ; 即ds:[bx]的内容就是data段第一个单元的内容  
  15.                 mov ax,data
  16.                 mov ds,ax
  17.                
  18.                 ;设置显示缓存区段
  19.                 mov ax,0b800h ;设置起始缓存
  20.                 mov es,ax               
  21.                
  22.                 ;设置栈段
  23.                 mov ax,stack
  24.                 mov ss,ax
  25.                 mov sp,10h  ;指向栈顶
  26.                
  27.                 ;初始化三个寄存器
  28.                 mov bx,780h ; 行 从12-14行(注意:从第1行开始计数)
  29.                 mov si,10h ; 颜色的偏移量,三次循环每次
  30.                                         ; 增加 1h 指向下一个颜色
  31.                
  32.                 mov cx,3    ; 三次循环改变行
  33.         s:         mov ah,ds:[si] ;颜色事先存放在ah中
  34.                 push cx               
  35.                 push si
  36.                
  37.                
  38.                 mov cx,16  ; 16次循环改变列
  39.                
  40.                 mov si,64  ; 这里的si的意义是多少列,
  41.                         ; 为什么从64列开始呢?
  42.                         ; (1)字符串为32字节,16字节ASCLL码,16字节属性
  43.                     ; (2)每一行有160列,那么余下有 160-32=128列为空白
  44.                         ;    要使得字符串居中显示,那么字符串的左边和右边
  45.                         ;          都应该是64字节(128/2),而列数是从0开始计数,
  46.                         ; 所以左边的64字节为0-63,所以这里偏移量为64
  47.                 mov di,0  
  48.                                        
  49.         s0:        mov al,ds:[di] ;将date段中的字符一个一个传入es中
  50.                 mov es:[bx+si],al ; 低位存放字符
  51.                 mov es:[bx+si+1],ah ; 高位存放颜色
  52.                
  53.                 add si,2  ;显示缓存区字符ASCII码偏移量为2
  54.                 add di,1  ;data段字符的偏移量,每次加 1
  55.                
  56.                 loop s0
  57.                
  58.                 pop si  
  59.                 pop cx  ;后进先出,先出栈si,再出栈cx
  60.                
  61.                 add si,1h  ;指向下一个颜色
  62.                 add bx,0a0h ;指向下一行 160=0a0h
  63.                 loop s
  64.                
  65.                 mov ax,4c00h
  66.                 int 21h
  67. code ends

  68. end start
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

  2. stack segment
  3.         dw 8 dup (0)
  4. stack ends

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



  1. assume cs:code

  2. data segment
  3.         dw 8 dup (0)
  4. data ends

  5. code segment
  6. start:
  7.         mov ax,data
  8.         mov ss,ax
  9.         mov sp,16        ;空栈,大小为16字节
  10.        
  11.         mov word ptr ss:[0], offset s
  12.         ;将标号s处的偏移地址赋值到ss:[0]中,即栈的第8个字
  13.         mov ss:[2],cs
  14.         ;将寄存器CS的内容(标号s处的段地址)赋值到ss:[2]中,即栈的第7个字
  15.         call dword ptr ss:[0]
  16.         ;首先执行push CS和push IP(后一指令nop的CS和IP),此时SP=0CH
  17.         ;再执行jmp dword ptr ss:[0],目的地址由ss:[0]高地址(标号s处指令的段地址)给出、偏移地址由ss:[0]低地址(标号s处指令的偏移地址)给出
  18.         ;所以,此时的jmp dword ptr ss:[0]的功能是跳转到标号s处执行
  19.         nop
  20. s:
  21.         mov ax,offset s         ;将标号s处的偏移地址赋值到AX
  22.         sub ax,ss:[0cH]               
  23.         ;ax=ax-ss:[0cH],ss:[0cH]的值为栈顶元素,即nop指令的偏移地址,即s.IP-nop.IP为nop指令长度,即为1
  24.         mov bx,cs        
  25.         sub bx,ss:[0eH]
  26.         ;bx=bx-ss:[0eH],ss:[0eH]的值为第二栈顶元素,即nop指令的段地址,即cs-nop.CS,即为0
  27. code ends
  28. end start
复制代码
小甲鱼最新课程 -> https://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.循环打印

  1. assume cs:code

  2. data segment

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

  4. data ends

  5. code segment

  6. main:   ;字符串参数

  7.         mov dh, 8           ;屏幕的行数

  8.         mov dl, 3           ;所在行的列数

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

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

  11.       

  12.         mov ax, data

  13.         mov ds, ax

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

  15.         call show_str

  16.       

  17.         mov ax, 4c00H

  18.         int 21H

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

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

  21.     ;返回值:无

  22. show_str:   push dx

  23.             push cx

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

  25.            

  26.             mov ax, 0b800H

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

  28.            

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

  30.             mov al, 160         ;0a0H-   160字节/行
  31.             
  32.             dec dh

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

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

  35.             mov ax, 0

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

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

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

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

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

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

  42.            

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

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

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

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

  47.             add di, 2

  48.             inc si

  49.             jmp short show

  50.    

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

  52.             pop dx

  53.             pop cx              ;恢复寄存器

  54.             ret

  55.    

  56. code ends

  57. end main
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

3.全部取出,放入对应的寄存器中

  1. assume cs:code
  2. code segment
  3. start:

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

  9.         mov ax, 4c00H
  10.         int 21H

  11. divdw:                      ;子程序开始

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

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

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

  23. code ends
  24. end start  
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-11-26 10:56:39 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

感谢哥10.5一直看不懂,第一个为什么ip为什么是oe怎么来的啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-16 23:04

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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