8086汇编 在屏幕上显现动态菱形图案

在屏幕上显现动态菱形图案。 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * <图一> <图二> <图三> <图四> <图五> 思路示例: <1>编写程序p1: 显示一个字符 <2>把程序p1做成子程序,调用子程序编写程序p2: 显示一个菱形<图三> <3>把p2做成一个子程序,调用子程序编写程序p3: 循环显示出如图五种图形 <4>修改程序p2,实现动态效果: 添加清屏子程序和延时子程序,完成完整程序。 注意点: 要求以统一逻辑实现全部的五个图形。 第三层的公式见代码 assume cs:code code segment start: ; [ input: al: row ] ; [ ah: column ] mov cx,10 start_s: mov di,0 mov si,1 call p3 mov di,4 mov si,-1 call p3 loop start_s mov ax,4c00h int 21h p3: ; -- input: di (index of p2) si (1 or -1) push ax push bx push cx push dx push di ; mov cx,5 ; times ; cmp di,3 ; jne p3_di_not_4 ; p3_di_not_4: mov cx,4 ; times ; mov di,0 p3_s: push cx mov cx,di mov dl,'*' call p2 pop cx ; bx ax lay time mov ax,0 mov bx,1 push cx p3_layout: sub ax,1 sbb bx,0 mov cx,ax or cx,bx cmp cx,0 jne p3_layout pop cx push cx mov cx,di mov dl,' ' call p2 pop cx add di,si loop p3_s pop di pop dx pop cx pop bx pop ax ret p2: push ax push bx push cx ; ----- [1] ----------- mov al,10 mov ah,10 mov bl,al mov bh,ah call p1 add bl,1 ; ----- [2] ----------- push cx cmp cx,0 je p2_2_cx_is_0 sub cx,1 p2_2_cx_is_0: mov al,bl mov ah,bh sub ah,cl call p1 mov ah,bh add ah,cl call p1 pop cx add bl,1 ; ----- [3] ----------- ; left:ah = bh-1-(1+1+(cl-2))*(cl-1)/2 ; = bh-1-cl*(cl-1)/2 = bh-segdis ; right: bh+1+cl*(cl-1)/2 = bh+segdis ; segdis = 1+cl*(cl-1)/2 push cx cmp cx,0 je p2_3_cx_is_0 mov al,cl ; cl sub cl,1 ; cl-1 mul cl ; cl*(cl-1) -> ax mov cl,2 ; 2 div cl ; cl*(cl-1)/2 -> al add al,1 ; cl*(cl-1)/2+1 mov cl,al ; segdis p2_3_cx_is_0: mov al,bl mov ah,bh sub ah,cl ; bh - segdis call p1 mov ah,bh add ah,cl ; bh + segdis call p1 pop cx add bl,1 ; ----- [4] ----------- push cx cmp cx,0 je p2_4_cx_is_0 sub cx,1 p2_4_cx_is_0: mov al,bl mov ah,bh sub ah,cl call p1 mov ah,bh add ah,cl call p1 pop cx add bl,1 ; ----- [5] ----------- mov al,bl mov ah,bh call p1 pop cx pop bx pop ax ret p1: ; ----- input: al: row ah: column dl:char push ax push bx push es mov bx,0b800h mov es,bx mov bl,ah mov bh,al mov al,160 mul bh add bl,bl mov bh,0 add ax,bx mov bx,ax mov byte ptr es:[bx],dl mov byte ptr es:[bx+1],2 pop es pop bx pop ax ret code ends end start ; -------*------- 7 ; -------*------- 7 7 ; -------*------- 7 7 ; -------*------- ; -------*------- ; -------*------- 7 ; -------*------- 7 7 ; ------*-*------ 6 8 ; -------*------- ; -------*------- ; 7-1-(1+1+(n-2))*(n-1)/2 ; 2 ; -------*------- 7 ; ------*-*------ 6 8 ; -----*---*----- 5 9 ; ------*-*------ ; -------*------- ; 3 ; -------*------- 7 ; -----*---*----- 5 9 ; ---*-------*--- 3 11 ; -----*---*----- ; -------*------- ; -------*------- 7 ; ----*-----*---- 4 10 ; *-------------* 0 14 ; ----*-----*---- ; -------*-------

SuCicada

8086汇编:在安全空间画金字塔

assume cs:code code segment mov ax,20h mov ds,ax mov cx,8 s: mov dx,cx mov bx,cx sub bx,1 ; -------------------- mov cx,9 sub cx,dx ; mov cx,bx add cx,cx sub cx,1 j: mov al,'a' mov [bx],al inc bx loop j ; mov cx,dx ; add bx,10h mov ax,ds add ax,1 mov ds,ax ; mov bx,cx loop s mov ax,4c00h int 21h code ends end 。。。。

SuCicada

8086汇编:清空0020:0 到0020:0ff空间

assume cs:code code segment ; This code is used to clear the memory ; of the safe area from 0020:0 to 0020:ff mov ax,20 mov ds,ax mov cx,0ffh mov bx,0 s: mov ax,0 mov ds:[bx],ax inc bx loop s mov ax,4c00h int 21h code ends end

SuCicada

8086汇编:自动编译链接脚本

@echo off echo code: %1 echo masm..... masm %1; echo link....... link %1; del %1.obj echo delete %1.obj echo finish 起个名 比如 run.bat 放到环境变量下,很方便

SuCicada

8086汇编语言王爽 17.3 字符串的输入 (含输入溢出问题分析)

如果直接使用书上的代码, 会发现输入一定字符就会卡死 先上代码, 或者跳到问题 assume cs:code ; dsstack segment ; db 16 dup(0) ; dsstack ends code segment start: ; mov ax,dsstack ; mov ds,ax ; mov si,13 ; mov sp,160 call getstr mov ax,4c00h int 21h getstr: push ax getstrs: mov ah,0 int 16h cmp al,20h jb nochar mov ah,0 call charstack mov ah,2 call charstack jmp getstrs nochar: cmp ah,0eh je backspace cmp ah,1ch je enter jmp getstrs backspace: mov ah,1 call charstack mov ah,2 call charstack jmp getstrs enter: mov al,0 mov ah,0 call charstack mov ah,2 call charstack pop ax ret ; ================================== charstack: jmp short charstart table dw charpush,charpop,charshow top dw 0 ; top of stack charstart: push bx push dx push di push es cmp ah,2 ja charret mov bl,ah mov bh,0 add bx,bx jmp word ptr table[bx] charpush: mov bx,top mov ds:[si][bx],al add top,1 jmp charret charpop: cmp top,0 je charret dec top mov bx,top mov al,[si][bx] jmp charret charshow: mov bx,0b800h mov es,bx mov al,160 mov ah,0 mul dh mov di,ax add dl,dl mov dh,0 add di,dx mov bx,0 charshows: cmp bx,top jne noempty mov byte ptr es:[di],'+' ; 结束符 jmp charret noempty: mov al,[si][bx] mov es:[di],al mov byte ptr es:[di+2],'+' ; 结束符 inc bx add di,2 jmp charshows charret: pop es pop di pop dx pop bx ret code ends end start 问题 问题现象:...

SuCicada

王源 汇编语言 课设2 8086-boot

代码见https://github.com/SuCicada/8086-Boot 第二版 2019/5/31 23:06 见 class2i.asm 文件 1、偏移地址可以从0开始算了! 将要拷贝软盘中的代码放到新的data段中,然后在 0:7c00h 处的代码一开始就跳转 07c0:0h 处,这样就解决了偏移地址无法从0开始算的问题,可以抛弃 偏移量 site 的做法了。 2、引导操作系统一步到位 废弃了将代码(what拷贝硬盘到7c00h处,并从7c00h执行)拷贝到 0:200h 这个安全地方执行的做法。 采取的新方法就是,将引导操作系统这部分功能的代码--移动到 0:7c00h - 0:07dffh 这512字节之外的地方,这样就安全了!目前是放到了 3功能(显示时间)之后 3、独立的信息显示模块 show_info 函数单独拿出来,又减少了100行代码 4、更少的代码 从原先的1100行降到890行,少了210行。 第一版 主要从2019/5/17 到2019/5/21 日,大约历经40小时 见 class2i.asm 文件 1.关于硬盘拷贝的位置 引导操作系统时,硬盘这个 80h 磁盘,必须将一开始的部分拷贝到 0:7c00h 处,不能换成是别的地方,所以这就还在拷贝的时候覆盖原有的代码,导致拷贝之后无法跳转到 0:7c00h 处执行。 所以采用的是:将拷贝与执行代码,一并拷贝到其他的安全的地方,比如 0:200h 处。

SuCicada

王爽 汇编 课设1

使用temp空间来暂存每一行要显示的字符, 然后调用show_str子程序 进行显示 外层21次循环 难点:dd段的数字太大,无法简单进行除10存储, 需要借助div_d 大除法的子程序(更改的), assume cs:code,ds:table,ss:stack stack segment db 32 dup (0) stack ends table segment db 81 dup(0) ; temp空间 ; 81 * 1 = 81 byte 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 * 4 = 84 byte dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514 ; 12 dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000 ; 21 * 4 = 84 byte dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226 dw 11542,14430,15257,17800 ; 21 * 2 = 42 byte db 1,0,0,0,0 ; 循环的第几,年的第几,钱的第几,人的第几,当前temp空间的指向 ; 5 * 1 = 5 byte table ends code segment start: mov ax,stack mov ss,ax mov sp,32 mov ax,table ; 原始数据 mov ds,ax mov bx,0 ; 年的计数 mov cx,21 main_loop: push cx ; ds:[84+84+42+5] 是temp区域 ; =========== 年 =============== ; 显示4列 mov cx,4 mov bl,ds:[81+84+84+42][1] ; 年的字节在哪 mov bh,0 mov si,0 start_s1: mov dl, ds:81[bx] ; 记得跳过81byte mov ds:[si],dl inc bx inc si loop start_s1 mov al,4 mov ds:[81+84+84+42][4],al ; ================ 空格 ================= mov cx,4 ; 空格数量 ; mov dl,ds:[81+84+84+42][4] call add_space ; 存储空格 ; add dl,4 ; mov ds:[81+84+84+42][4],dl ; temp扩增了 ; =================== 收入 ================== ; 显示10列 mov bl,ds:[81+84+84+42][2] ; 收入的字节在哪 mov bh,0 mov ax,ds:[81+84][bx] mov dx,ds:[81+84][bx+2] mov bl,ds:[81+84+84+42][4] mov bh,0 mov si,bx ; 存到 ds:[....

SuCicada