主頁 > .NET開發 > 回圈到第二個方程

回圈到第二個方程

2021-10-18 02:17:20 .NET開發

我正在用nasm 86x制作一個小計算器,它可以讀取兩行形式的方程式

3 2

6 / 2

它應該計算并輸出

5

3

它是用戶輸入的,但只有2個數字,它將讀取要使用的運算子,然后轉到我呼叫該運算子的地方,并做方程。我只是不知道如何回圈,以便它也能讀到下一行。我試著用硬編碼,但對于div運算子來說很困難,因為我清除了上面的暫存器,因為我不關心復雜的數字。

segment .data 

    NO: db 'Invalid input', 10
    nolen: equ $-NO
    
    段 .bss
    ;定義所有的變數
       space resb 1
       num1 resb 1
       num2 resb 1
       ;第二個方程
       num3 resb 1
       num4 resb 1
       char resb 1
       char2 resb 1
    ;換行用于輸入字符,也許
    newlin resb 1
    ;結果
       resb 1   
  
    .text部分
       全域_start ;使用gcc時必須宣告。
        
    _start: ;告訴聯結器入口點
        
     mov cx, 2
     
    ;讀取空間
       mov eax, 3
       mov ebx, 0  
       mov ecx, space 
       mov edx, 1
       int 0x80  

    ;讀取數字1
       mov eax, 3
       mov ebx, 0  
       mov ecx, num1 
       mov edx, 1
       int 0x80  
    
    ;讀取空間
       mov eax, 3
       mov ebx, 0  
       mov ecx, space 
       mov edx, 1
       int 0x80  

       
    ;讀取字符
        mov eax, 3
        mov ebx, 0
        mov ecx, char
        mov edx, 1
        int 0x80
            
    ;讀取空間
       mov eax, 3
       mov ebx, 0  
       mov ecx, space
       mov edx, 1
       int 0x80  


    ;讀取數字2
       mov eax, 3
       mov ebx, 0
       mov ecx, num2 
       mov edx, 1
       int 0x80   
                   
    ;讀取空間
       mov eax, 3
       mov ebx, 0  
       mov ecx, space
       mov edx, 1
       int 0x80  
                          
    ;讀取下一行
       mov eax, 3
       mov ebx, 0  
       mov ecx, newlin
       mov edx, 1
       int 0x80


    
       ; 將第一個數字移至eax暫存器,第二個數字移至ebx暫存器
       并減去ascii'0',將其轉換為十進制數字
       ;移動下半部分的變數
       
       
       mov AX, [char].
       ;比較char和正號
       cmp AX, 位元組 ' 
       ;跳轉到加號函式
       跳轉到加號
       cmp AX, byte '-' ;跳到減號函式
       ;跳轉到減號
       跳轉到減法函式 je minus
       cmp AX, 位元組 '*
       ;跳轉到乘法
       je multi
       cmp AX, 位元組 '/'
       跳轉到除法
       je divi
       jmp Nope
       cmp AX, 2
       je _start

       不對。
       mov eax, 4
       mov ebx, 1
       mov ecx, NO
       mov edx, nolen
       int 0x80
       jmp exit
       
       加。
       mov al, [num1].
       mov bl, [num2]
       添加al, bl
       子al,'0
       mov [res], al
       
       
       列印總和 
       mov eax, 4       
       mov ebx, 1
       mov ecx, res        
       mov edx, 1
       cmp ecx, 2
       je _start
       int 0x80
       jmp exit
      
       
       減去。
       mov al, [num1].
       mov bl, [num2]
       sub al, bl
       添加al,'0
       mov [res], al
       ;列印子程式 
       mov eax, 4       
       mov ebx, 1
       mov ecx, res         
       mov edx, 1 
       cmp ecx, 2
       je _start
       int 0x80
       jmp exit
       
       多。
       mov al, [num1].
       mov bl, [num2]
       子al,'0'
       sub bl, '0
       ;將它們相乘
       mul bl
       ;sub bl, '0'
       添加al,'0
       mov [res], al
       ;添加al,'0
       ;列印總和 
       mov eax, 4       
       mov ebx, 1
       mov ecx, res         
       mov edx, 1
       cmp ecx, 2
       je _start
       int 0x80
       jmp exit
       
       divi:
       mov al, [num1].
       mov bl, [num2]
       mov dx, 0
       mov ah, 0
       子al,'0
       sub bl, '0
       div bl
       添加ax,'0
       mov [res], al
       ; 列印除法的輸出
       mov eax, 4       
       mov ebx, 1
       mov ecx, res         
       mov edx, 1
       cmp ecx, 2
       je _start
       int 0x80
       jmp exit
      

    退出。   
       mov eax, 1
       mov ebx, 0
       int 0x80

我讀了我的教科書,它說要使用cmp ecx, 2和je _start,但我想我沒有正確使用它。我至少讓它達到了半作業狀態,只是最后一行我無法做到。現在,它總是正確地輸出第一個值,只是對其他的值沒有列印出來。

uj5u.com熱心網友回復:

這是關于暫存器的保存

mov cx, 2

;讀取空間
mov eax, 3
mov ebx, 0  
mov ecx, space 
mov edx, 1
int 0x80

通過mov cx, 2指令,你設定了一個回圈計數器,所以你的代碼可以運行兩次。這很好,但就在幾條指令之后,你用mov ecx, space指令破壞了這個計數器,加載了一個緩沖區地址。不要忘記,CX只是ECX暫存器的低16位。 一個解決方案是將計數器存盤在堆疊上。

 mov ecx, 2 ; 在32位代碼中使用ECX而不是CX!
  push ecx ; (1) 保留計數器

  ;讀取空間
  mov eax, 3
  mov ebx, 0  
  mov ecx, space 
  mov edx, 1
  int 0x80
  ...

這關系到你如何以及在哪里進行回環

作為一個例子,請看plus代碼:

; print the sum mov eax, 4 mov ebx, 1 mov ecx, res mov edx, 1 cmp ecx, 2 <-- 額外的代碼來回回圈 je _start <-- int 0x80 jmp exit

首先,你應該將額外的代碼放在int 0x80指令的下面,這樣列印函式就可以先完成它的作業。 第二,ECX暫存器不包含你的回圈計數器,因為mov ecx, res指令就在上面的幾行!
。 第三,使用計數器意味著代碼需要對其進行操作。大多數情況下,這可以歸結為對它進行遞減。

一個快速的解決方案:

 ; 列印總和 
  mov eax, 4       
  mov ebx, 1
  mov ecx, res        
  mov edx, 1
  int 0x80

  pop ecx ; (1) 恢復計數器
  dec ecx ; 遞減計數器
  jnz _start ; 如果計數器還沒有歸零,則回圈往復。
  jmp exit ; 如果計數器為零則退出程式

現在你可以將此應用于4個代碼塊plusminusmultidivi中的每一個,或者你可以寫得更聰明些:

plus。
  ... ; 計算和列印在這里進行
  jmp MORE
減去。
  ... ; 計算和列印在這里進行
  jmp MORE
多。
  ... ; 計算和列印在這里進行
  jmp MORE
divi:
  ... ; 計算和列印到此為止
  jmp MORE

MORE:
  pop ecx ; (1) 恢復計數器
  dec ecx ; 遞減計數器
  jnz _start ; 如果計數器還沒有歸零,則回環計算
exit: ; 如果計數器為零則退出程式
  mov eax, 1
  mov ebx, 0
  int 0x80

這是關于你回環到哪里的問題

_start標簽是程式開始執行的地方。這不能成為回環的目標,因為如果我們這樣做,我們將永遠重新初始化計數器,程式將永遠無法終止。 我們保留計數器的那一行才是正確的回環目標:

mov ecx

 mov ecx, 2 ; 在32位代碼中使用ECX而不是CX!
AGAIN: <----------------------------------------------------------------
  push ecx ; (1)保留計數器。
                                                                         |
  ...                                                                    |
                                                                         |
更多                                                                    |
  pop ecx ; (1) 恢復計數器|
  dec ecx ; 遞減計數器。
  jnz AGAIN ; 如果計數器還沒有歸零,則回圈往復 -----/
exit: ; 如果計數器為零則退出程式
  mov eax, 1
  mov ebx, 0
  int 0x80

需要繼續注意的事項

mov AX, [char].
;比較char和plus符號
cmp AX, byte ' 
;跳轉到加號函式
跳轉到加號

char變數是一個byte。千萬不要把它當作一個字來讀。如果討厭的事情會發生,它們就會發生......

 mov al, [char].
  cmp al, ' '
  je plus
  cmp al, '-'
  je minus
  cmp al, '*
  多重
  cmp al, '/'。
  讀取Divi
諾普。
  mov eax, 4
  mov ebx, 1
  mov ecx, NO
  mov edx, nolen
  int 0x80
  jmp退出






一定要有一個最后的評論

jmp Nope
cmp AX, 2 <- 這些行將永遠不會執行
je _start <-
Nope。

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/320399.html

標籤:

上一篇:BT指令與進位標志CF之間的聯系

下一篇:堆疊是如何區分不同的數字型別的?

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • WebAPI簡介

    Web體系結構: 有三個核心:資源(resource),URL(統一資源識別符號)和表示 他們的關系是這樣的:一個資源由一個URL進行標識,HTTP客戶端使用URL定位資源,表示是從資源回傳資料,媒體型別是資源回傳的資料格式。 接下來我們說下HTTP. HTTP協議的系統是一種無狀態的方式,使用請求/ ......

    uj5u.com 2020-09-09 22:07:47 more
  • asp.net core 3.1 入口:Program.cs中的Main函式

    本文分析Program.cs 中Main()函式中代碼的運行順序分析asp.net core程式的啟動,重點不是剖析原始碼,而是理清程式開始時執行的順序。到呼叫了哪些實體,哪些法方。asp.net core 3.1 的程式入口在專案Program.cs檔案里,如下。ususing System; us ......

    uj5u.com 2020-09-09 22:07:49 more
  • asp.net網站作為websocket服務端的應用該如何寫

    最近被websocket的一個問題困擾了很久,有一個需求是在web網站中搭建websocket服務。客戶端通過網頁與服務器建立連接,然后服務器根據ip給客戶端網頁發送資訊。 其實,這個需求并不難,只是剛開始對websocket的內容不太了解。上網搜索了一下,有通過asp.net core 實作的、有 ......

    uj5u.com 2020-09-09 22:08:02 more
  • ASP.NET 開源匯入匯出庫Magicodes.IE Docker中使用

    Magicodes.IE在Docker中使用 更新歷史 2019.02.13 【Nuget】版本更新到2.0.2 【匯入】修復單列匯入的Bug,單元測驗“OneColumnImporter_Test”。問題見(https://github.com/dotnetcore/Magicodes.IE/is ......

    uj5u.com 2020-09-09 22:08:05 more
  • 在webform中使用ajax

    如果你用過Asp.net webform, 說明你也算是.NET 開發的老兵了。WEBform應該是2011 2013左右,當時還用visual studio 2005、 visual studio 2008。后來基本都用的是MVC。 如果是新開發的專案,估計沒人會用webform技術。但是有些舊版 ......

    uj5u.com 2020-09-09 22:08:50 more
  • iis添加asp.net網站,訪問提示:由于擴展配置問題而無法提供您請求的

    今天在iis服務器配置asp.net網站,遇到一個問題,記錄一下: 問題:由于擴展配置問題而無法提供您請求的頁面。如果該頁面是腳本,請添加處理程式。如果應下載檔案,請添加 MIME 映射。 WindowServer2012服務器,添加角色安裝完.netframework和iis之后,運行aspx頁面 ......

    uj5u.com 2020-09-09 22:10:00 more
  • WebAPI-處理架構

    帶著問題去思考,大家好! 問題1:HTTP請求和回傳相應的HTTP回應資訊之間發生了什么? 1:首先是最底層,托管層,位于WebAPI和底層HTTP堆疊之間 2:其次是 訊息處理程式管道層,這里比如日志和快取。OWIN的參考是將訊息處理程式管道的一些功能下移到堆疊下端的OWIN中間件了。 3:控制器處理 ......

    uj5u.com 2020-09-09 22:11:13 more
  • 微信門戶開發框架-使用指導說明書

    微信門戶應用管理系統,采用基于 MVC + Bootstrap + Ajax + Enterprise Library的技術路線,界面層采用Boostrap + Metronic組合的前端框架,資料訪問層支持Oracle、SQLServer、MySQL、PostgreSQL等資料庫。框架以MVC5,... ......

    uj5u.com 2020-09-09 22:15:18 more
  • WebAPI-HTTP編程模型

    帶著問題去思考,大家好!它是什么?它包含什么?它能干什么? 訊息 HTTP編程模型的核心就是訊息抽象,表示為:HttPRequestMessage,HttpResponseMessage.用于客戶端和服務端之間交換請求和回應訊息。 HttpMethod類包含了一組靜態屬性: private stat ......

    uj5u.com 2020-09-09 22:15:23 more
  • 部署WebApi隨筆

    一、跨域 NuGet參考Microsoft.AspNet.WebApi.Cors WebApiConfig.cs中配置: // Web API 配置和服務 config.EnableCors(new EnableCorsAttribute("*", "*", "*")); 二、清除默認回傳XML格式 ......

    uj5u.com 2020-09-09 22:15:48 more
最新发布
  • C#多執行緒學習(二) 如何操縱一個執行緒

    <a href="https://www.cnblogs.com/x-zhi/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2943582/20220801082530.png" alt="" /></...

    uj5u.com 2023-04-19 09:17:20 more
  • C#多執行緒學習(二) 如何操縱一個執行緒

    C#多執行緒學習(二) 如何操縱一個執行緒 執行緒學習第一篇:C#多執行緒學習(一) 多執行緒的相關概念 下面我們就動手來創建一個執行緒,使用Thread類創建執行緒時,只需提供執行緒入口即可。(執行緒入口使程式知道該讓這個執行緒干什么事) 在C#中,執行緒入口是通過ThreadStart代理(delegate)來提供的 ......

    uj5u.com 2023-04-19 09:16:49 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    <a href="https://www.cnblogs.com/huangxincheng/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/214741/20200614104537.png" alt="" /&g...

    uj5u.com 2023-04-18 08:39:04 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    一:背景 1. 講故事 前段時間協助訓練營里的一位朋友分析了一個程式卡死的問題,回過頭來看這個案例比較經典,這篇稍微整理一下供后來者少踩坑吧。 二:WinDbg 分析 1. 為什么會卡死 因為是表單程式,理所當然就是看主執行緒此時正在做什么? 可以用 ~0s ; k 看一下便知。 0:000> k # ......

    uj5u.com 2023-04-18 08:33:10 more
  • SignalR, No Connection with that ID,IIS

    <a href="https://www.cnblogs.com/smartstar/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/u36196.jpg" alt="" /></a>...

    uj5u.com 2023-03-30 17:21:52 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:15:33 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:13:31 more
  • C#遍歷指定檔案夾中所有檔案的3種方法

    <a href="https://www.cnblogs.com/xbhp/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/957602/20230310105611.png" alt="" /></a&...

    uj5u.com 2023-03-27 14:46:55 more
  • C#/VB.NET:如何將PDF轉為PDF/A

    <a href="https://www.cnblogs.com/Carina-baby/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2859233/20220427162558.png" alt="" />...

    uj5u.com 2023-03-27 14:46:35 more
  • 武裝你的WEBAPI-OData聚合查詢

    <a href="https://www.cnblogs.com/podolski/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/616093/20140323000327.png" alt="" /><...

    uj5u.com 2023-03-27 14:46:16 more