這邊是要將實驗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)— 由編譯器自動分配釋放 ,存放函數的參數值,局
說在前面: 什麼是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
以下內容來自 彙編語言 第2版 作者:王爽 1. 8086cpu不支持將數據直接送入段寄存器,mov bx,1000H, mov ds,bx 可用bx中轉,也可用別的寄存器中轉。 2. cs代碼段寄存器、ip指令指針寄存器指