PCDVD數位科技討論區

PCDVD數位科技討論區 (https://www.pcdvd.com.tw/index.php)
-   七嘴八舌異言堂 (https://www.pcdvd.com.tw/forumdisplay.php?f=12)
-   -   求助 組合語言問題 (https://www.pcdvd.com.tw/showthread.php?t=1137057)

天天開心 2017-11-03 09:16 PM

求助 組合語言問題
 
目的為得到輸入文字,作為日後比對正確性..
假設我輸入ABCDEFG

lea ebx,[esp+18] //這行[esp+18]是輸入的文字
push ebx
mov ebx,[ebx]
mov [00486E00],ebx //將[esp+18]放入00486E00 這位置是固定的不會動
pop ebx

可是00486E00位置的值得到的卻是ABCD
也就是DWORD的長度
要如何解決這問題?
幫幫忙吧 :nonono:

X_Tiger 2017-11-03 09:46 PM

你應該是要把 esp + 18 用 rep movsb 搬到 486e00 吧, 你從 esp+18 放到 ebx 再從 ebx 放到 486e00 本來就會只有 32bits

你要先搞懂何謂 pointer .. 跟 memory address...

冰的啦魔王大人 2017-11-03 09:59 PM

引用:
作者X_Tiger
你應該是要把 esp + 18 用 rep movsb 搬到 486e00 吧, 你從 esp+18 放到 ebx 再從 ebx 放到 486e00 本來就會只有 32bits

你要先搞懂何謂 pointer .. 跟 memory address...



我還記得我們的期末作業是用組合語言寫一個可以放大字型的程式。
老師說沒交的這門課就死當。
:laugh:

我。。。有交,但是交了C與ASM混合的.
於是得 60分.
:laugh:

天天開心 2017-11-03 10:34 PM

上面的代碼要如何改呢?
我查了一下 rep movsb,就這一行指令,沒有其他語法
功力很差,整個概念不是很懂
只能先求答案再思考進而了解

asccpu 2017-11-04 10:48 AM

首先你要先確定輸入的字有多少個,不然你怎知要存放多少?
既然知道輸入字數,與要比之字串字數一比,不同當然就不用比了,除非允許輸入字超出比對數。

而指令可去抓 http://1drv.ms/1LQQyc0 內的PDF,然後詳看以下頁數(雖說是486CPU指令,但也可用現今CPU。建議以以下次序查閱):
PAGE. 94 , 71 , 63 , 118 , 28 , 29

absolute 2017-11-04 10:50 AM

1個附加檔案
引用:
作者冰的啦魔王大人
我還記得我們的期末作業是用組合語言寫一個可以放大字型的程式。老師說沒交的這門課就死當。

不知有影沒影:
https://life.tw/?app=view&no=186283

喵刹 2017-11-04 01:19 PM

引用:
作者天天開心
目的為得到輸入文字,作為日後比對正確性..
假設我輸入ABCDEFG

lea ebx,[esp+18] //這行[esp+18]是輸入的文字
push ebx
mov ebx,[ebx]
mov [00486E00],ebx //將[esp+18]放入00486E00 這位置是固定的不會動
pop ebx

可是00486E00位置的值得到的卻是ABCD
也就是DWORD的長度
要如何解決這問題?
幫幫忙吧 :nonono:


lea ebx,dword ptr [esp+18]
push ebx
mov ebx,dword ptr [ebx]
mov dword ptr [00486E00],ebx
mov ebx,dword ptr [ebx+4]
mov dword ptr [00486E04],ebx
pop ebx

喵刹 2017-11-04 02:47 PM

上面寫錯了 :think:

應該多用一個暫存器, 如果輸入的字串是固定長度(8-byte)
lea ebx,dword ptr [esp+18]
push ebx
push eax // 多備份一個EAX
mov eax,dword ptr [ebx]
mov dword ptr [00486E00],eax
mov eax,dword ptr [ebx+4]
mov dword ptr [00486E04],eax
pop eax
pop ebx

天天開心 2017-11-04 05:27 PM

引用:
作者喵刹
上面寫錯了 :think:
如果輸入的字串是固定長度(8-byte)


上面代碼看似把被切掉的Dword搬移到下一組位置
那麼如果字串長度不一定呢...是否只能用 rep movsb

我下班再下載pdf研究


另外問個企鵝Linux 的問題...
如果同樣是X86CPU,是否能像上例子
去獲得想要的字串?
甚至像win32程式去call windows的API,跳出對話框之類呢?

感謝各位指點

adolphin 2017-11-04 06:04 PM

那個字串會在那個位置一定是有程式搬過去的,誰搬的,沒其他資訊?
長度不一定的話如何判斷長度,結束字元為何?
winapi當然只有在win底下才能呼叫,linux有自己的api吧.


所有的時間均為GMT +8。 現在的時間是12:27 AM.

vBulletin Version 3.0.1
powered_by_vbulletin 2024。