这边是要将实验7的公司的数据显示在dos窗口下,这边只给出代码
DATAS SEGMENT ;此处输入数据段代码 db '1975','1976','1977','1978','1979','1980','1981','1982','1983','1984','1985','1986','1987','1988','1989','1990','1991','1992','1993','1994','1995' ;以上是21年的21个字符串 dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514,345980,590827,803530,1183000,1843000,2759000,3753000,4549000,5937000 ;以上是公司的21年各个年份的总输入 dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226,11542,14430,15257,17800 ;以上是21个员工人数 dd 21 dup (0) ;起始这边没有必要弄成事双字节型的,因为刚好员工的平均收入都没有 超过65535这边设置双字节型只是为了巩固学习的知识 db 10 dup (0) ;作为数据送入现存的一个缓存中介 DATAS ENDS STACKS SEGMENT ;此处输入堆栈段代码 dw 20h dup (0) STACKS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKS START: MOV AX,DATAS MOV DS,AX ;此处输入代码段代码 mov ax,stacks mov ss,ax mov sp,20h ;这边先算出员工平均收入,然后再将所有的数据写入到显存中 mov cx,21 mov si,84 ;设置公司总收入游标 mov di,168 ;设置员工人数游标 averg: mov ax,ds:[si] mov dx,ds:[si+2] mov bx,ds:[di] call divdw ;进行相除运算 ;将结果放入到定义好的数据段中 mov word ptr ds:[si+126],ax mov word ptr ds:[si+126+2],dx add si,4 add di,2 loop averg ;接下来我们逐个项目的放入表中 ;先是年份,再试每年总收入,再试员工数,再是员工平均收入 ;重新初始化一些内存数据 mov cx,21 mov si,0 mov di,294 ;缓存段起始地址 mov dl,2 ;第二行 mov dh,2 ;第二列 show_year: push cx ;暂存循环次数 mov cl,2h mov ax,ds:[si] mov ds:[di],ax mov ax,ds:[si+2] mov ds:[di+2],ax mov byte ptr ds:[di+4],0 ;将年份放入缓存区,并且使其最后一个字节是0 ;将缓存区中的内容放入显存中 push si mov si,di call show_str pop si ;恢复si pop cx ;恢复cx add si,4 ;指向下一个年份 inc dh ;显示的位置移到下一行 loop show_year ;先是总收入 mov cx,21 mov si,84 ;年总收入的数据的偏移 add di,8 mov dl,18 mov dh,2 show_sum: push cx ;暂存循环次数,一边下边设置显示字符串的属性 push dx ;暂时保存显示位置数据 mov ax,ds:[si] mov dx,ds:[si+2] call dtoc mov ax,si mov si,di pop dx mov cx,2 call show_str mov si,ax add si,4 ;指向下一个数值 mov di,302 ;从新确定缓存区模拟对战顶部位置 inc dh ;移到下一行准备显示下一条数据 pop cx loop show_sum ;下面是员工人数的显示 mov cx,21 mov si,168 mov di,302 mov dl,34 mov dh,2 show_wksnum: push cx mov ax,ds:[si] call dtocword ;这边因为函数中调用的方法是不一样的所以才如此 push si mov si,di mov cx,2 call show_str pop si add si,2 mov di,302 inc dh pop cx loop show_wksnum ;员工人均收入的显示 mov cx,21 mov si,210 mov di,302 mov dl,50 mov dh,2 show_salary: push cx push dx mov ax,ds:[si] mov dx,ds:[si+2] call dtoc mov ax,si ;暂时保存si的值 mov si,di pop dx mov cx,2 call show_str mov si,ax add si,4 ;指向下一个数值 mov di,302 ;从新确定缓存区模拟对战顶部位置 inc dh ;移到下一行准备显示下一条数据 pop cx loop show_salary finals: jmp short finals MOV AH,4CH INT 21H divdw: ;说明一下,这边的被除数是双字型,除数是字型,商是双字型 ;参数说明:ax:存放被除数的低位;dx:存放被除数的高位;bx:除数 ;返回:ax:商的低位;dx:商的低位;bx:余数 push cx push si push di push ax ;将低位暂存 ,这边用的是书中的算法(有一个公式) mov ax,dx ;将高位移向低位 mov dx,0 ;高位赋0 div bx ;做除法 mov cx,ax ;将商暂存 pop ax ;将原来除数的低位恢复,刚刚的余数dx显示是除数的高位 div bx ;再做除法 mov bx,dx ;现在的余数是原来除数的最终于舒 mov dx,cx ;原来第一次的商事最终商的高位,这个是可以证明的 ;解除除法溢出子程序结束 pop di pop si pop cx ret show_str: push dx;保存数据 push cx push di push ax mov ax,0b800h mov es,ax ;确定字符显示位置的偏移量 mov al,160 ;这边显示缓存虽是80个字符,但是容量是160字节,每个字符占2个字节的容量 mul dh mov dh,0 add ax,dx add ax,dx ;因为一个字符占两个字节的缘故 mov bx,ax mov al,cl ;标记显示内存的偏移 mov di,0 s: mov ch,0 mov cl,[si] jcxz ok mov byte ptr es:[bx+di],cl mov byte ptr es:[bx+di+1],al inc si add di,2 jmp short s ok: pop ax pop di pop cx ;恢复数据 pop dx ret dtoc: push cx dtocs: mov bx,0ah ;除数是10 call divdw ;求余 add bx,30h mov byte ptr ds:[di],bl ;将余数放入到显存中 mov cx,dx or cx,ax ;上面两句是判断上是不是0 jcxz ok2 ;如果商是零的话,求余结束 dec di ;这边di是模拟堆栈指针,放入一个字节后,di自减 jmp short dtocs ok2: pop cx ret dtocword: push cx dtocwords: mov bl,0ah call divw add bl,30h mov byte ptr ds:[di],bl mov cx,ax jcxz ok1 dec di jmp short dtocwords ok1: pop cx ret divw: ;说明:这边的被除数是字型,除数字节型,商是字型 ;参数说明:ax:存放被除数 bl:除数 ;返回:ax:商 bl:余数 push dx mov dl,al mov al,ah mov ah,0 div bl mov dh,al mov al,dl div bl mov bl,ah mov ah,dh pop dx ret CODES ENDS END START
执行结果:
攔截窗口: bp CreateWindow 創建窗口 bp CreateWindowEx(A) 創建窗口 bp ShowWindow 顯示窗口 bp
非本人作也!因非常經典,所以收歸旗下,與衆人閱之!原作者不祥! 堆和棧的區別 一、預備知識—程序的內存分配 一個由c/C++編譯的程序佔用的內存分爲以下幾個部分 1、棧區(stack)— 由編譯器自動分配釋放 ,存放函數的參數值,局
1. 前言 前文實現“代碼可視化”需要了解的前置知識-編譯器前端介紹了編譯器前端知識並附帶了小練習,本文將繼續介紹編譯器中端相關的知識,還是概念+練習的學習方式。中間代碼是用來進行程序分析和實現代碼可視化的關鍵數據,瞭解其生成和優化方式能
說在前面: 什麼是pyc文件? pyc是一種二進制文件,是由py文件經過編譯後,生成的文件,是一種byte code,py文件變成pyc文件後,加載的速度有所提高,pyc 文件是 Python 編譯過的字節碼文件。它是 Python 程
最近復現了兩個棧溢出漏洞的cve,分別是CVE-2017-9430和CVE-2017-13089,簡單記錄一下real wrold中的棧溢出漏洞學習。目前,棧溢出漏洞主要出現在iot固件中,linux下的已經很少了,所以這兩個洞都是17年,
併發和並行的含義 目標都是最大化CPU的使用率 並行(parallel) : 指在同一時刻,有多條指令在多個處理器上同時執行。 所以無論從微觀還是 從宏觀來看,二者都是一起執行的。 併發(concurrency):指在同一時刻只能
前言 爲啥要寫這個呢,因爲寫程序也7-8年了,有一些感悟,想寫下來,雖然這個命題有點大,但是呢,我覺得並不誇張,下面進入正題。 打好基礎 其實就是學東西不管學什麼基礎纔是重要的,比如寫程序有的人會說能用就行,可是我覺
不知道你是否使用過IDA的條件斷點呢?在IDA進階使用中,它的很多功能都有大作用,比如:ida-trace來跟蹤調用流程。同時IDA的斷點功能也十分強大,配合IDA-python的輸出語句能夠大殺特殺! 那麼本文就介紹一下這個功能點,使用z
背景介紹 應用安裝包的體積影響着用戶下載量、安裝時長、用戶磁盤佔用量等多個方面,據Google Play統計,應用體積每增加6MB,安裝的轉化率將下降1%。 安裝包的體積受諸多方面影響,針對dex、資源文件、so文件都有不同的優化策略,在
Nasm中文手冊 -------------------------------------------------------------------------------- 第一章: 簡介 --------------
1977 1978
加法的優化相對來說比較簡單,只有3種優化方案,下面我們就以一個簡單的例子來說明這三個問題,先看源碼:int _tmain(int argc, _TCHAR* argv[]){ int nNum, nA = 8; nNum = argc
;安裝一個新的int9中斷例程,功能:在dos下,按下‘A’鍵後,除非不在鬆開, ;如果松開,就顯示滿屏幕的‘A’,其他鍵照常處理(鬆開一個鍵的
from DUI0067D_ADS1_2_CompLib 3.13 type qulifiers 有部分摘自ARM編譯器文檔對齊部分對齊的使用:1.__align(num) 這個用於修改最高級別對象的字節邊界。在彙編中使用LDRD或
1.數據類型在各種機器中所佔的字節數不同16位平臺 char 1個字節8位 short 2個字節16位 int