王爽

汇编语言(王爽版)学习笔记 实验2 用机器指令和汇编指令编程

放肆的年华 提交于 2020-03-17 20:41:39
实验任务: 操作过程: 答: mov ax,[0] ; ax=C0EA add ax,[2] ; ax=C0FC mov bx,[4] ; bx=30F0 add bx,[6] ; bx=6021 push ax ; sp= 00FE ;修改的内存单元的地址是2200:FE-2200:FF 内容为C0FC (push指令执行前,sp先减2) push bx ; sp=00FC ;修改的内存单元的地址是2200:FC-2200:FD 内容为6021 pop ax ; sp=00FE ; ax=6021 pop bx ; sp= 00FC ; ax=C0FC push [4] ; sp=00FE ;修改的内存单元的地址是2200:FE-2200:FF 内容为30F0 push [6] ; sp=00FC ;修改的内存单元的地址是2200:FC-2200:FD 内容为 2F31 教材在实验2的介绍部分有如下的说明: 来源: CSDN 作者: Wo_Knight 链接: https://blog.csdn.net/weixin_43092232/article/details/104835565

汇编语言(王爽版)学习笔记 第一章 基础知识(1)

妖精的绣舞 提交于 2020-03-03 01:47:12
引言 汇编语言是直接在硬件之上工作的编程 语言,首先要了解硬件系统的结构,才 能有效的应用汇编语言对其编程。 在本章中,对硬件系统结构的问题进行一部分的探讨,以使后续的课程可在一 个好的基础上进行。 1.1 机器语言 机器语言是机器指令的集合。 机器指令展开来讲就是一台机器可以正确执行的命令。 例如,指令:01010000 (PUSH AX) 机器语言产生早期程序员们将 0、1 数字编程的程序代码打在纸带或卡片上,1打孔,0不打孔,再将程序通过纸带机或卡片机输入计算机,进行运算。 1.2汇编语言的产生 汇编语言的主题是汇编指令。 汇编指令和机器指令的差别在于表示方式上。(英文<—>01代码) 例如: 机器指令:1000100111011000 含义:寄存器BX的内容送到AX中 汇编指令:MOV AX,BX 过程图 提前知识: 寄存器:简单的讲是CPU中可以存储数据的器件,一个CPU中有多个寄存器。 1.3汇编语言的组成 汇编语言由以下三类组成: 汇编指令(机器码的助记符) 例:jmp,mov等 伪指令(由编译器执行) 不是可执行指令 例:标号: DS (数值表达式) 其它符号(由编译器识别) 汇编语言的核心是汇编指令 1.4存储器 指令和数据在存储器中存放,也就是平时所说的 内存 。 CPU是计算机的核心部件,CPU的工作需要向其提供指令和数据。 磁盘不同于内存

汇编语言(王爽)实验五

爱⌒轻易说出口 提交于 2020-02-29 16:44:03
实验五 1、将下面的程序编译、连接,用Debug加载、跟踪,然后回答问题 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 CPU执行程序,程序返回前,data段中的数据为多少? 不变 CPU执行程序,程序返回前,cs=076C、ss=076B、ds=076A 程序刚加载时,ds=075A,因为psp的存在,data段段地址为076A,赋值以后ds=076A,而data段占16个字节076A:10=076B:0,cs段同理,虽然在物理地址上这三个段是连续的,但由于被分为三个段,那么段地址必定要不同 设程序加载后,code段的段地址为X,则data段的段地址为X-2,stack段的段地址为X-1 2

汇编语言王爽第七部分(算术运算指令)

心已入冬 提交于 2020-02-13 12:16:30
算术运算指令 实现寄存器和内存的数据的算术运算。结果影响标志寄存器的内容。 add和sub 求和指令 add ax,bx ax=ax+bx 减法指令 sub ax,bx ax=ax-bx (1)add/sub 寄存器 , 寄存器/内存单元/立即数 (2)add/sub 内存单元 , 寄存器 (3)运算对象的类型要匹配 adc 带进位加法指令,它利用CF位记录进位值 功能:操作对象1=操作对象1+操作对象2+CF 比如adc ax,bx (ax)=(ax)+(bx)+CF sbb 带借位减法指令,它利用CF位记录借位值 功能:操作对象1=操作对象1-操作对象2-CF 比如adc ax,bx (ax)=(ax)-(bx)-CF inc和dec inc功能:操作数=操作数+1 dec功能:操作数=操作数-1 比如 inc bx (bx)=(bx)+1 dec bx (bx)=(bx)-1 div 除法指令 (1)除数:有8位和16位,在内存单元或寄存器 (2)被除数:默认放在ax或ax和dx中 注意以下问题 如果除数为8位,al存储商,ah存储余数 如果除数为16位,ax存储商,dx存储余数 比如除数为16位:100001/100, mov dx,1 mov ax,86a1H mov bx,100 div bx 比如除数为8位:1001/100 mov ax,1001 mov bl

汇编语言(王爽)9章jmp指令

六眼飞鱼酱① 提交于 2020-02-09 01:26:42
jmp short 标号 jmp near ptr 标号 jmp far ptr 标号 jmp 16位reg,如jmp ax jmp word ptr 内存单元地址 jmp dword ptr 内存单元地址 详情百度https://www.jianshu.com/p/c685c1c033ff 若要使程序中的jmp指令执行后,CS:IP指向程序的第一条指令,在data段中应该定义哪些数据? 若要指向第一条指令,则要使IP的值为0000H即可,而jmp word ptr为段内转移指令,相当于把IP值赋值为后面内存单元的值,故只需要[0001]处的字是0即可。 即[0001]和[0002]处的字节都是0。 使用t单步执行,可以发现程序进入死循环。 assume cs : code data segment ? //db 'x',0,0,'x' data ends code segment s : mov ax , data mov ds , ax mov bx , 0 jmp word ptr [ bx + 1 ] mov ax , 4 c00h int 21 h code ends end s (2)补全程序,使得jmp指令执行后,CS:IP指向第一条指令 由于执行jmp指令后指向第一条指令,CS段没有改变,只需要改变IP值为0000H

汇编语言 第三版 王爽 课程设计1

大兔子大兔子 提交于 2020-01-31 02:26:09
课程设计1 题目要求 实验7 实验10 当然在做了课程设计1后 实验10中只有“数值显示”是比较成功的 分析 将数据存储在table中 ('year summ nn ave ') table格式(‘88484’)数字代表字节数 共32字节 大致步骤如下 1.传入字符 2.传入收入 人数为数据 需要转换为字符 dtoc dtoc 过程中需要用到 divdw 但不是所有数据都需要 由于之前的经验不足 这次直接重写两个函数 divdw 改为 div_plus 使之能够判断被除数是否需要进行32位除法 dtoc 直接包含 div_plus 并且参数更加明确 能够被直接调用 3.传入人数 4.计算人均收入传入 5.将数据以十进制显示在屏幕上 show_str 那么重点问题就在第二步上 这里先给出代码 要注意子程序传入的参数若不是空闲寄存器需要入栈保存数值 dotc 功能 将dword或word数据转换为字符 参数 ax 高16位 dx 低16位 ds:[si] 空闲内存 返回si地址 便于后续的调用 dtoc: psi: push si re: mov cx,0ah push bx call div_plus ;执行完后cx为余数 ax低位 dx高位 pop bx add cx,30h mov ds:[si],cl inc si mov cx,ax ;判断最后一位 jcxz finsh

汇编语言 王爽 第三版 实验十

╄→гoц情女王★ 提交于 2020-01-28 20:38:24
实验10 三题 对跳转指令的巩固 显示字符串 解决除法溢出 数值显示 显示字符串 题目要求 题目分析 把 实验9 中代码改为一个接口 行对应地址为 行数 X A0 列对应地址为 (列数 X 2) H 代码 assume cs:code, ds:data data segment db 'Welcome to Masm!',0 data ends code segment start: mov dh,8 mov dl,3 mov cl,2 mov ax,data mov ds,ax mov si,0 call show_str mov ax,4c00h int 21h show_str: mov ax,0b800h mov es,ax mov bh,dh mov bl,dl mov ax,0a0h mul bh mov si,ax ;行 mov ax,2 mul bl mov di,ax ;列 add si,di mov bx,si mov si,0 mov di,0 s: push cx mov cl,ds:[si] jcxz ok mov al,ds:[si] ;字符及属性 pop cx mov ah,cl mov es:[bx+di],ax inc si add di,2 jmp short s ok: pop cx ret code ends end start 结果 问题

汇编语言-王爽——实验四

て烟熏妆下的殇ゞ 提交于 2020-01-26 21:27:24
问题 :编程,向内存0:200 ~ 0:23F依次传送数据 0~63(3FH),程序中只能使用九条指令。 分析:在这里,我使用了寄存器 dx 的低位 dl 来存储需要向内存中传输的数据。并在每次循环中,完成数据的传输与数据变化。 ;lab1 . ams assume cs : code code segment mov ax , 0 mov ds , ax mov bx , 200 h mov dl , 0 mov cx , 40 h s : mov [ bx ] , dl inc dl inc bx loop s mov ax , 4 c00h int 21 h code ends end 运行结果: 来源: CSDN 作者: 江明翰 链接: https://blog.csdn.net/weixin_44342238/article/details/104089040

王爽《汇编语言》实验7

我的未来我决定 提交于 2019-12-22 08:39:38
DATAS 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' DD 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514 DD 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000 DW 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226 DW 11542,14430,15257,17800 DATAS ENDS TABLES SEGMENT DB 21 DUP ('year summ ne ?? ') TABLES ENDS STACKS SEGMENT STACK DW 8 DUP(0) STACKS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS START: MOV AX,DATAS MOV DS,AX MOV AX,TABLES