1518610955 发表于 2024-11-1 15:44:47

汇编检测点

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

个人汇总,到11章为止

jackz007 发表于 2024-11-1 15:53:09

不都有答案了吗,几个意思?

1518610955 发表于 2024-11-1 16:03:14

jackz007 发表于 2024-11-1 15:53
不都有答案了吗,几个意思?

想做一份自己的

FishC 发表于 2024-11-1 16:32:37

请问您需要关于汇编检测点1.1的具体帮助吗?如果有代码或具体问题,请提供更多信息,我会尽力帮助您。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

不二如是 发表于 2024-11-1 17:44:50

{:10_266:}{:10_256:}{:10_256:}全是考点

tomok 发表于 2024-11-1 20:42:42

学习温故知新

1518610955 发表于 2024-11-4 09:14:30

1.1补充
1.8086读取次数:
1024÷(16÷8)=512次,以为一个字节是8位。
2.30386读取次数:
1024÷(32÷8)=256次,以为一个字节是8位。

1518610955 发表于 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

1518610955 发表于 2024-11-4 10:57:25

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

2.3补充
ip每次增加,大小为所执行指令的长度

1518610955 发表于 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:
      mov ss:, ax
      mov ax, es:
      add ss:, 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
      add bx,2
      loop s

      mov ax, 4c00H
      int 21H

code ends
end start


1518610955 发表于 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,        ;使用al上面定义的数据单元为字节 db 不是 dw 。
            and al, 11011111B
            mov , al
            inc si
            loop s2
            add bx, 16
            pop cx
            loop s1
            
            mov ax, 4c00H
            int 21H
codesg ends
end start

1518610955 发表于 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:
            mov dx, ds:2H
            mov es:, ax
            mov es:2H, dx         ;yeas

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

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

            mov ax, ds:0A8H
            mov es:0aH, 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,来记录,以此在循环中的正确寻址
最后,按要求循环分别寻址打印即可

1518610955 发表于 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:的内容就是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: ;颜色事先存放在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: ;将date段中的字符一个一个传入es中
                mov es:,al ; 低位存放字符
                mov es:,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

1518610955 发表于 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:       
        ;首先执行push IP(下一条inc的偏移地址),此时SP=0EH;再执行jmp word ptr ds:,目的偏移地址由ds:给出
        ;因为DS和SS指向同一片内存,且(SP)=0EH,所以ds:相当于栈顶元素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:, offset s
        ;将标号s处的偏移地址赋值到ss:中,即栈的第8个字
        mov ss:,cs
        ;将寄存器CS的内容(标号s处的段地址)赋值到ss:中,即栈的第7个字
        call dword ptr ss:
        ;首先执行push CS和push IP(后一指令nop的CS和IP),此时SP=0CH
        ;再执行jmp dword ptr ss:,目的地址由ss:高地址(标号s处指令的段地址)给出、偏移地址由ss:低地址(标号s处指令的偏移地址)给出
        ;所以,此时的jmp dword ptr ss:的功能是跳转到标号s处执行
        nop
s:
        mov ax,offset s         ;将标号s处的偏移地址赋值到AX
        sub ax,ss:               
        ;ax=ax-ss:,ss:的值为栈顶元素,即nop指令的偏移地址,即s.IP-nop.IP为nop指令长度,即为1
        mov bx,cs        
        sub bx,ss:
        ;bx=bx-ss:,ss:的值为第二栈顶元素,即nop指令的段地址,即cs-nop.CS,即为0
code ends
end start

1518610955 发表于 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:指向字符串。

    ;返回值:无

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:   ;将字符串单个字符读入cl中

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

            mov es:, cl    ;在显示缓冲区中写入字符

            mov es:, al    ;在显示缓冲区中写入字符属性

            add di, 2

            inc si

            jmp short show

   

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

            pop dx

            pop cx            ;恢复寄存器

            ret

   

code ends

end main

1518610955 发表于 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

1518610955 发表于 2024-11-26 10:56:39

参考链接:https://blog.51cto.com/u_14724733/5978476

哥救我 发表于 2024-11-28 17:07:38

jackz007 发表于 2024-11-1 15:53
不都有答案了吗,几个意思?

感谢哥10.5一直看不懂,第一个为什么ip为什么是oe怎么来的啊
页: [1]
查看完整版本: 汇编检测点